日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[译]Vulkan教程(32)生成mipmap

發(fā)布時(shí)間:2024/4/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [译]Vulkan教程(32)生成mipmap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[譯]Vulkan教程(32)生成mipmap

Generating Mipmaps 生成mipmap

Introduction 入門

Our program can now load and render 3D models. In this chapter, we will add one more feature, mipmap generation. Mipmaps are widely used in games and rendering software, and Vulkan gives us complete control over how they are created.

現(xiàn)在我們的程序可以加載和渲染3D模型了。本章,我們將添加一個特性,mipmap生成。Mipmap廣泛應(yīng)用于游戲和渲染軟件,Vulkan給了我們完全的控制權(quán)-關(guān)于如何創(chuàng)建它們。

Mipmaps are precalculated, downscaled versions of an image. Each new image is half the width and height of the previous one. Mipmaps are used as a form of?Level of Detail?or?LOD.?Objects that are far away from the camera will sample their textures from the smaller mip images. Using smaller images increases the rendering speed and avoids artifacts such as?Moiré patterns. An example of what mipmaps look like:

Mipmap是預(yù)計(jì)算的,縮小版本的image。每個新image都是是一個的寬度和高度的一半。Mipmap用于作為Level of Detail(即LOD)的一種方式。遠(yuǎn)離攝像機(jī)的對象會從紋理的比較小的mip圖像上采樣。使用更小的image會增加渲染速度,避免Moiré patterns這樣的鋸齒。一個mipmap的例子如下:

?

?

Image creation

In Vulkan, each of the mip images is stored in different?mip levels?of a?VkImage. Mip level 0 is the original image, and the mip levels after level 0 are commonly referred to as the?mip chain.

在Vulkan中,每個mip圖像都保存在VkImage的不同的mip層里。Mip層0是最初的圖像,之后的mip層被稱為mip鏈。

The number of mip levels is specified when the?VkImage?is created. Up until now, we have always set this value to one. We need to calculate the number of mip levels from the dimensions of the image. First, add a class member to store this number:

Mip層的數(shù)量在VkImage?創(chuàng)建時(shí)指定。直到現(xiàn)在,我們總數(shù)設(shè)置這個值為1。我們需要根據(jù)image的維度計(jì)算mip層的數(shù)量。首先,添加類成員to記錄這個數(shù):

... uint32_t mipLevels; VkImage textureImage; ...

?

The value for?mipLevels?can be found once we've loaded the texture in?createTextureImage:

mipLevels?的值可以在我們在createTextureImage加載了紋理之后立即得到:

int texWidth, texHeight, texChannels; stbi_uc* pixels = stbi_load(TEXTURE_PATH.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); ... mipLevels = static_cast<uint32_t>(std::floor(std::log2(std::max(texWidth, texHeight)))) + 1;

?

This calculates the number of levels in the mip chain. The?max?function selects the largest dimension. The?log2 function calculates how many times that dimension can be divided by 2. The?floor?function handles cases where the largest dimension is not a power of 2.?1?is added so that the original image has a mip level.

這計(jì)算了mip鏈中的層的數(shù)量。max?函數(shù)選擇了最大的維度。log2函數(shù)計(jì)算維度可以被2除多少次。floor?函數(shù)處理最大維度不是2的指數(shù)的問題。增加1使得原始圖像有1個mip層。

To use this value, we need to change the?createImage,?createImageView, and?transitionImageLayout?functions to allow us to specify the number of mip levels. Add a?mipLevels?parameter to the functions:

為使用這個值,我們需要修改createImage、createImageView和transitionImageLayout?函數(shù)to允許我們指定mip層的數(shù)量。給這些函數(shù)添加mipLevels?參數(shù):

void createImage(uint32_t width, uint32_t height, uint32_t mipLevels, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory) {...imageInfo.mipLevels = mipLevels;... } VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels) {...viewInfo.subresourceRange.levelCount = mipLevels;... void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels) {...barrier.subresourceRange.levelCount = mipLevels;...

?

Update all calls to these functions to use the right values:

更新所有對這些函數(shù)的調(diào)用,使用正確的值:

createImage(swapChainExtent.width, swapChainExtent.height, 1, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, depthImage, depthImageMemory); ... createImage(texWidth, texHeight, mipLevels, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory); swapChainImageViews[i] = createImageView(swapChainImages[i], swapChainImageFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1); ... depthImageView = createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, 1); ... textureImageView = createImageView(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT, mipLevels); transitionImageLayout(depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1); ... transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mipLevels);

?

Generating Mipmaps 生成mipmap

Our texture image now has multiple mip levels, but the staging buffer can only be used to fill mip level 0. The other levels are still undefined. To fill these levels we need to generate the data from the single level that we have. We will use the?vkCmdBlitImage?command. This command performs copying, scaling, and filtering operations. We will call this multiple times to?blit?data to each level of our texture image.

我們的紋理圖像現(xiàn)在有多個mip層,但是暫存buffer只能用于填充mp層0。其他的層還是未定義的。問填入這些層,我們需要為每個層生成數(shù)據(jù)。我們要用vkCmdBlitImage?命令。這個命令試試復(fù)制、縮放和過濾操作。我們多次調(diào)用它來位塊傳送blit數(shù)據(jù)到每個層。

VkCmdBlit?is considered a transfer operation, so we must inform Vulkan that we intend to use the texture image as both the source and destination of a transfer. Add?VK_IMAGE_USAGE_TRANSFER_SRC_BIT?to the texture image's usage flags in?createTextureImage:

VkCmdBlit?被認(rèn)為是轉(zhuǎn)移操作,所以我們必須通知Vulkan,我們想使用紋理圖像既作為源又作為目標(biāo)。在createTextureImage中添加VK_IMAGE_USAGE_TRANSFER_SRC_BIT?到紋理圖像的用法標(biāo)志:

... createImage(texWidth, texHeight, mipLevels, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory); ...

?

Like other image operations,?vkCmdBlitImage?depends on the layout of the image it operates on. We could transition the entire image to?VK_IMAGE_LAYOUT_GENERAL, but this will most likely be slow. For optimal performance, the source image should be in?VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL?and the destination image should be in?VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL. Vulkan allows us to transition each mip level of an image independently. Each blit will only deal with two mip levels at a time, so we can transition each level into the optimal layout between blits commands.

像其他圖像操作一樣,vkCmdBlitImage?依賴于image的布局。我們可以轉(zhuǎn)換整個image到VK_IMAGE_LAYOUT_GENERAL,但是這會很慢。為最優(yōu)性能考慮,源image應(yīng)當(dāng)是VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL?,目標(biāo)image應(yīng)當(dāng)是VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL。Vulkan允許我們獨(dú)立地轉(zhuǎn)換每個mip層。每次blit只會處理2個mip層,所以我們可以在兩次blit命令之間轉(zhuǎn)換每個層到最優(yōu)布局。

transitionImageLayout?only performs layout transitions on the entire image, so we'll need to write a few more pipeline barrier commands. Remove the existing transition to?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL?in?createTextureImage:

transitionImageLayout?只在整個image上實(shí)施布局轉(zhuǎn)換,所以我們需要再寫點(diǎn)管道屏障命令。將createTextureImage中已有的轉(zhuǎn)換改為VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL?:

... transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mipLevels);copyBufferToImage(stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight)); //transitioned to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL while generating mipmaps ...

?

This will leave each level of the texture image in?VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL. Each level will be transitioned to?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL?after the blit command reading from it is finished.

這會讓各個層處于VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL。在blit命令從層讀取完成后,每個層會被轉(zhuǎn)換為VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL?。

We're now going to write the function that generates the mipmaps:

我們現(xiàn)在要寫這個函數(shù)that生成mipmap:

void generateMipmaps(VkImage image, int32_t texWidth, int32_t texHeight, uint32_t mipLevels) {VkCommandBuffer commandBuffer = beginSingleTimeCommands();VkImageMemoryBarrier barrier = {};barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;barrier.image = image;barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;barrier.subresourceRange.baseArrayLayer = 0;barrier.subresourceRange.layerCount = 1;barrier.subresourceRange.levelCount = 1;endSingleTimeCommands(commandBuffer); }

?

We're going to make several transitions, so we'll reuse this?VkImageMemoryBarrier. The fields set above will remain the same for all barriers.?subresourceRange.miplevel,?oldLayout,?newLayout,?srcAccessMask, and?dstAccessMask?will be changed for each transition.

我們要做幾個轉(zhuǎn)換,所以我們復(fù)用這個VkImageMemoryBarrier。上述字段的設(shè)置會對所有的屏障想通subresourceRange.miplevel、oldLayout、newLayout、srcAccessMask和dstAccessMask?會隨著每個轉(zhuǎn)換而改變。

int32_t mipWidth = texWidth; int32_t mipHeight = texHeight;for (uint32_t i = 1; i < mipLevels; i++) {}

?

This loop will record each of the?VkCmdBlitImage?commands. Note that the loop variable starts at 1, not 0.

這個循環(huán)會錄制每個VkCmdBlitImage?命令。注意,循環(huán)變量從1開始,不是0。

barrier.subresourceRange.baseMipLevel = i - 1; barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;vkCmdPipelineBarrier(commandBuffer,VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,0, nullptr,0, nullptr,1, &barrier);

?

First, we transition level?i - 1?to?VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL. This transition will wait for level?i - 1?to be filled, either from the previous blit command, or from?vkCmdCopyBufferToImage. The current blit command will wait on this transition.

首先,我們轉(zhuǎn)換層i - 1到VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL。這個轉(zhuǎn)換會等待層i - 1被填入,或者來自上一個blit命令,或者來自vkCmdCopyBufferToImage。當(dāng)前blit命令會等待這次轉(zhuǎn)換。

VkImageBlit blit = {}; blit.srcOffsets[0] = { 0, 0, 0 }; blit.srcOffsets[1] = { mipWidth, mipHeight, 1 }; blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blit.srcSubresource.mipLevel = i - 1; blit.srcSubresource.baseArrayLayer = 0; blit.srcSubresource.layerCount = 1; blit.dstOffsets[0] = { 0, 0, 0 }; blit.dstOffsets[1] = { mipWidth > 1 ? mipWidth / 2 : 1, mipHeight > 1 ? mipHeight / 2 : 1, 1 }; blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; blit.dstSubresource.mipLevel = i; blit.dstSubresource.baseArrayLayer = 0; blit.dstSubresource.layerCount = 1;

?

Next, we specify the regions that will be used in the blit operation. The source mip level is?i - 1?and the destination mip level is?i. The two elements of the?srcOffsets?array determine the 3D region that data will be blitted from.?dstOffsets?determines the region that data will be blitted to. The X and Y dimensions of the?dstOffsets[1]?are divided by two since each mip level is half the size of the previous level. The Z dimension of?srcOffsets[1]?and?dstOffsets[1]?must be 1, since a 2D image has a depth of 1.

接下來,我們知道要被這次blit操作使用的區(qū)域。源mip層是i - 1,目標(biāo)mip層是i。srcOffsets?數(shù)組的2個元素決定了數(shù)據(jù)會從哪個區(qū)域填充。dstOffsets?決定了數(shù)據(jù)會被填入的區(qū)域。dstOffsets[1]?的X和Y維度被2除,因?yàn)槊總€mip層都是上一個的一半。srcOffsets[1]?和dstOffsets[1]的Z維度必須是1,因?yàn)?D圖像的深度就是1。

vkCmdBlitImage(commandBuffer,image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,1, &blit,VK_FILTER_LINEAR);

?

Now, we record the blit command. Note that?textureImage?is used for both the?srcImage?and?dstImage parameter. This is because we're blitting between different levels of the same image. The source mip level was just transitioned to?VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL?and the destination level is still in?VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL?from?createTextureImage.

現(xiàn)在,我們錄制blit命令。注意,textureImage?同時(shí)用于srcImage?和dstImage參數(shù)。這是因?yàn)槲覀円谕粓D像的不同層上blit。源mip層被轉(zhuǎn)換為VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL?,目標(biāo)mip層還是從createTextureImage來的VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL?。

The last parameter allows us to specify a?VkFilter?to use in the blit. We have the same filtering options here that we had when making the?VkSampler. We use the?VK_FILTER_LINEAR?to enable interpolation.

最后一個參數(shù)允許我們指定用于blit的VkFilter?。我們制作時(shí)也使用了相同的過濾選項(xiàng)。我們使用VK_FILTER_LINEAR?來啟用插值。

barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;vkCmdPipelineBarrier(commandBuffer,VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0,0, nullptr,0, nullptr,1, &barrier);

?

This barrier transitions mip level?i - 1?to?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. This transition waits on the current blit command to finish. All sampling operations will wait on this transition to finish.

這個屏障轉(zhuǎn)換mip層i - 1為VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL。這個轉(zhuǎn)換等待當(dāng)前blit命令完成。所有的采樣操作都會等待這個轉(zhuǎn)換完成。

...if (mipWidth > 1) mipWidth /= 2;if (mipHeight > 1) mipHeight /= 2; }

?

At the end of the loop, we divide the current mip dimensions by two. We check each dimension before the division to ensure that dimension never becomes 0. This handles cases where the image is not square, since one of the mip dimensions would reach 1 before the other dimension. When this happens, that dimension should remain 1 for all remaining levels.

在循環(huán)的結(jié)尾,我們將當(dāng)前mip維度除以2。我們檢查每個維度before除法,以確保維度不會成為0。這處理了image不是正方形的情況,因?yàn)槠渲幸粋€mip維度會先到達(dá)1。此時(shí),那個維度就應(yīng)當(dāng)繼續(xù)為1 for剩下的層。

barrier.subresourceRange.baseMipLevel = mipLevels - 1;barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;vkCmdPipelineBarrier(commandBuffer,VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0,0, nullptr,0, nullptr,1, &barrier);endSingleTimeCommands(commandBuffer); }

?

Before we end the command buffer, we insert one more pipeline barrier. This barrier transitions the last mip level from?VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL?to?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. This wasn't handled by the loop, since the last mip level is never blitted from.

在我們結(jié)束命令buffer前,我們再插入一個管道屏障。這個屏障轉(zhuǎn)換最后一個mip層from VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL?to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL。這沒有被循環(huán)處理,因?yàn)樽詈笠粋€mip層從沒blit給誰。

Finally, add the call to?generateMipmaps?in?createTextureImage:

最后,在createTextureImage中添加對generateMipmaps?的調(diào)用:

transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, mipLevels);copyBufferToImage(stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight)); //transitioned to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL while generating mipmaps ... generateMipmaps(textureImage, texWidth, texHeight, mipLevels);

?

Our texture image's mipmaps are now completely filled.

我們的紋理圖像的mipmap現(xiàn)在就完全填入了。

Linear filtering support 對線性過濾的支持

It is very convenient to use a built-in function like?vkCmdBlitImage?to generate all the mip levels, but unfortunately it is not guaranteed to be supported on all platforms. It requires the texture image format we use to support linear filtering, which can be checked with the?vkGetPhysicalDeviceFormatProperties?function. We will add a check to the?generateMipmaps?function for this.

使用內(nèi)置函數(shù)如vkCmdBlitImage?來生成所有的mip層是很方便的,但不幸的是,它不保證在所有平臺上都被支持。它要求紋理圖像格式支持線性過濾,這可以在vkGetPhysicalDeviceFormatProperties?函數(shù)中檢查。我們要添加這樣的檢查到generateMipmaps?函數(shù)。

First add an additional parameter that specifies the image format:

首先添加額外參數(shù)that指定圖像格式:

void createTextureImage() {...generateMipmaps(textureImage, VK_FORMAT_R8G8B8A8_UNORM, texWidth, texHeight, mipLevels); }void generateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels) {... }

?

In the?generateMipmaps?function, use?vkGetPhysicalDeviceFormatProperties?to request the properties of the texture image format:

在函數(shù)中,使用vkGetPhysicalDeviceFormatProperties?檢查紋理圖像格式的屬性:

void generateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels) {// Check if image format supports linear blitting VkFormatProperties formatProperties;vkGetPhysicalDeviceFormatProperties(physicalDevice, imageFormat, &formatProperties);...

?

The?VkFormatProperties?struct has three fields named?linearTilingFeatures,?optimalTilingFeatures?and?bufferFeatures?that each describe how the format can be used depending on the way it is used. We create a texture image with the optimal tiling format, so we need to check?optimalTilingFeatures. Support for the linear filtering feature can be checked with the?VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT:

VkFormatProperties?結(jié)構(gòu)體有3個字段,linearTilingFeatures、optimalTilingFeatures?和bufferFeatures?,根據(jù)格式的使用方式,描述格式如何被使用。我們創(chuàng)建一個最優(yōu)tiling格式的紋理圖像,所以我們需要檢查optimalTilingFeatures。對線性過濾特性的支持可以用VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT查詢:

if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)) {throw std::runtime_error("texture image format does not support linear blitting!"); }

?

There are two alternatives in this case. You could implement a function that searches common texture image formats for one that?does?support linear blitting, or you could implement the mipmap generation in software with a library like?stb_image_resize. Each mip level can then be loaded into the image in the same way that you loaded the original image.

此時(shí)有2個選項(xiàng)。你可以實(shí)現(xiàn)一個函數(shù)that搜索場景的紋理圖像格式,找一個支持線性過濾的,或者你可以用一個庫來軟實(shí)現(xiàn)mipmap生成,像stb_image_resize一樣。然后每個mip層就可以被加載到image,就像你加載原始image那樣。

It should be noted that it is uncommon in practice to generate the mipmap levels at runtime anyway. Usually they are pregenerated and stored in the texture file alongside the base level to improve loading speed. Implementing resizing in software and loading multiple levels from a file is left as an exercise to the reader.

要注意到,實(shí)踐中不常在運(yùn)行時(shí)生成mipmap層的方式。一般的,它們都是預(yù)生成了,保存到紋理文件里to提升加載速度。軟件實(shí)現(xiàn)resize和加載多mip層就留給讀者作為練習(xí)了。

Sampler 采樣器

While the?VkImage?holds the mipmap data,?VkSampler?controls how that data is read while rendering. Vulkan allows us to specify?minLod,?maxLod,?mipLodBias, and?mipmapMode?("Lod" means "Level of Detail"). When a texture is sampled, the sampler selects a mip level according to the following pseudocode:

VkImage?記錄了mipmap數(shù)據(jù),但VkSampler?控制了渲染時(shí)數(shù)據(jù)如何被讀取。Vulkan允許我們指定minLod、maxLod、mipLodBias和mipmapMode?(Lod的意思是Level of Detail)。當(dāng)一個紋理被采樣時(shí),采樣器根據(jù)下述偽代碼選擇一個mip層:

lod = getLodLevelFromScreenSize(); //smaller when the object is close, may be negative lod = clamp(lod + mipLodBias, minLod, maxLod);level = clamp(floor(lod), 0, texture.mipLevels - 1); //clamped to the number of mip levels in the textureif (mipmapMode == VK_SAMPLER_MIPMAP_MODE_NEAREST) {color = sample(level); } else {color = blend(sample(level), sample(level + 1)); }

?

If?samplerInfo.mipmapMode?is?VK_SAMPLER_MIPMAP_MODE_NEAREST,?lod?selects the mip level to sample from. If the mipmap mode is?VK_SAMPLER_MIPMAP_MODE_LINEAR,?lod?is used to select two mip levels to be sampled. Those levels are sampled and the results are linearly blended.

如果samplerInfo.mipmapMode?是VK_SAMPLER_MIPMAP_MODE_NEAREST,lod?選擇mip層去采樣。如果mipmap模式是VK_SAMPLER_MIPMAP_MODE_LINEAR,lod?用于選擇2個mi層來采樣。這些層被采樣,結(jié)果被線性混合。

The sample operation is also affected by?lod:

采樣操作也被lod影響:

if (lod <= 0) {color = readTexture(uv, magFilter); } else {color = readTexture(uv, minFilter); }

?

If the object is close to the camera,?magFilter?is used as the filter. If the object is further from the camera,?minFilter?is used. Normally,?lod?is non-negative, and is only 0 when close the camera.?mipLodBias?lets us force Vulkan to use lower?lod?and?level?than it would normally use.

如果對象距離攝像機(jī)很近,magFilter?就用于過濾。如果對象距離攝像機(jī)很遠(yuǎn),minFilter?就用上了。一般地,lod?是非負(fù)數(shù),只有接近攝像機(jī)時(shí)才為0。mipLodBias?讓我們強(qiáng)制Vulkan使用比較低的lod?和level? than它一般用的。

To see the results of this chapter, we need to choose values for our?textureSampler. We've already set the?minFilter?and?magFilter?to use?VK_FILTER_LINEAR. We just need to choose values for?minLod,?maxLod,?mipLodBias, and?mipmapMode.

為了看看本章的結(jié)果,我們需要選擇我們的textureSampler值,我們已經(jīng)設(shè)置了minFilter?和magFilter? to使用VK_FILTER_LINEAR。我們只需選擇minLod、maxLod、mipLodBias和mipmapMode的值。

void createTextureSampler() {...samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;samplerInfo.minLod = 0; // OptionalsamplerInfo.maxLod = static_cast<float>(mipLevels);samplerInfo.mipLodBias = 0; // Optional ... }

?

To allow the full range of mip levels to be used, we set?minLod?to 0, and?maxLod?to the number of mip levels. We have no reason to change the?lod?value , so we set?mipLodBias?to 0.

為了使用全部范圍內(nèi)的mip層,我們設(shè)置minLod?為0,設(shè)置maxLod?為mip層的數(shù)量。我們沒有理由修改lod?值,所以我們設(shè)置mipLodBias?為0。

Now run your program and you should see the following:

現(xiàn)在運(yùn)行你的程序,你應(yīng)當(dāng)看到下述情景:

?

?

It's not a dramatic difference, since our scene is so simple. There are subtle differences if you look closely.

沒什么打的區(qū)別,因?yàn)槲覀兊膱鼍疤唵瘟?。如果你靠近觀看,會有微妙的區(qū)別。

?

?

The most noticeable difference is the writing on the signs. With mipmaps, the writing has been smoothed. Without mipmaps, the writing has harsh edges and gaps from Moiré artifacts.

最引人注意的區(qū)別是。有mipmap,寫入被平滑了。沒有mipmap,Moiré藝術(shù)品寫入會有刺目的邊界和裂縫。

You can play around with the sampler settings to see how they affect mipmapping. For example, by changing?minLod, you can force the sampler to not use the lowest mip levels:

你可以鼓搗鼓搗采樣器設(shè)置to看看它們?nèi)绾斡绊憁ipmap。例如,通過修改minLod,你可以強(qiáng)制采樣器不使用最低的mip層:

samplerInfo.minLod = static_cast<float>(mipLevels / 2);

?

These settings will produce this image:

這些設(shè)置會產(chǎn)生這樣的結(jié)果:

?

?

This is how higher mip levels will be used when objects are further away from the camera.

這就是更高的mip層會被使用的結(jié)果when對象原理攝像機(jī)。

C++ code?/?Vertex shader?/?Fragment shader

  • Previous

?

  • Next

?

轉(zhuǎn)載于:https://www.cnblogs.com/bitzhuwei/p/Vulkan-Tutorial-32-Generating-Mipmaps.html

總結(jié)

以上是生活随笔為你收集整理的[译]Vulkan教程(32)生成mipmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

在线成人性视频 | 欧美韩日精品 | 久久69av| 日韩三级中文字幕 | 在线天堂日本 | 亚洲激精日韩激精欧美精品 | 久久欧美综合 | 国产成人精品区 | 亚洲精品国产自产拍在线观看 | 亚州精品成人 | 成人国产精品 | 操久在线 | 丰满少妇对白在线偷拍 | 日韩国产高清在线 | 日本女人在线观看 | 毛片视频网址 | 99视频黄 | 久久久18 | 久久婷婷视频 | 成人免费观看在线视频 | 超碰在线97免费 | 国产精品久久久久久久久免费 | 国产丝袜网站 | 免费视频xnxx com | 亚洲综合色激情五月 | 亚洲最大av在线播放 | 最新色视频 | 九九久久国产精品 | 激情五月视频 | 色噜噜日韩精品一区二区三区视频 | 手机在线永久免费观看av片 | 久久久午夜精品理论片中文字幕 | 五月婷婷色 | 国产一级不卡毛片 | 亚洲女人天堂成人av在线 | 天天干天天搞天天射 | 欧美日韩视频在线观看免费 | 精品国产1区2区 | 在线免费观看国产 | 国产 成人 久久 | 黄色网在线免费观看 | 69国产成人综合久久精品欧美 | 91精品导航 | 免费观看性生活大片3 | 日韩一级电影网站 | 精品久久久久久一区二区里番 | 天天做日日爱夜夜爽 | 91精品国产福利 | 99精品免费网 | 激情五月婷婷网 | 久久免费看a级毛毛片 | 骄小bbw搡bbbb揉bbbb | 欧美看片 | 色五月激情五月 | av电影在线观看完整版一区二区 | 美国av大片 | 日韩,精品电影 | 一级片黄色片网站 | 久久一区二区三区日韩 | 热久久免费视频精品 | 波多野结衣在线中文字幕 | 99精品热视频 | 九九热中文字幕 | 最新国产精品亚洲 | 91av免费观看 | 日本中文字幕电影在线免费观看 | 亚洲欧洲久久久 | 久久亚洲精品国产亚洲老地址 | 久久激情小视频 | 国产黄色看片 | 日韩精品在线视频免费观看 | 亚洲欧洲成人精品av97 | 中文字幕在线观看的网站 | 久久在线 | 视频91在线 | 天天干天天草天天爽 | 黄色大片日本免费大片 | bbbb操bbbb| 久久一级片 | 久久久色 | av在线网站大全 | 日韩av免费一区二区 | 免费日韩高清 | 欧美日韩不卡在线观看 | 三级av小说 | 国产亚洲aⅴaaaaaa毛片 | 99视频在线精品免费观看2 | 欧美一级黄色片 | 日本大片免费观看在线 | 国产一区二区手机在线观看 | www.五月天婷婷 | 日韩性久久 | a视频免费 | 国产高清免费在线播放 | 日韩三级视频在线看 | 免费日韩av电影 | 在线成人国产 | 国产小视频在线看 | 日本女人在线观看 | 亚洲精品理论 | 亚洲精品久久久久999中文字幕 | 成人av一二三区 | 免费午夜视频在线观看 | 亚洲精品高清在线 | ww视频在线观看 | 玖玖在线精品 | 成人在线免费观看视视频 | 亚洲精选国产 | 国产精成人品免费观看 | 亚洲视屏在线播放 | 国产日韩视频在线观看 | 2023国产精品自产拍在线观看 | 日韩中文在线字幕 | 日韩久久精品一区二区三区 | 精品久久久久亚洲 | 91免费版成人| 国内视频在线 | 国内丰满少妇猛烈精品播放 | 日本午夜在线亚洲.国产 | 国产精品第54页 | 在线观看精品黄av片免费 | 久久午夜鲁丝片 | 色综合久久久久久久 | av黄色免费在线观看 | 国产一级久久 | 久草在线一免费新视频 | 特级毛片在线 | 久久九九免费 | aaa日本高清在线播放免费观看 | 91系列在线观看 | 91精品免费看 | 国产精品久久久久久久久免费 | 免费在线色视频 | 国产精品综合久久久久久 | 久久久国产精品麻豆 | 欧美一区二区三区在线播放 | 久综合网 | 免费麻豆网站 | 黄色三级免费网址 | 亚洲天堂香蕉 | 精品国模一区二区三区 | 国产黄免费看 | 日本高清久久久 | 亚州精品视频 | 精品一区av| 久久国产免 | 国产日韩欧美在线播放 | 国产免费激情久久 | 亚洲1级片 | 成人久久电影 | 成人18视频| 中文字幕亚洲在线观看 | 日本亚洲国产 | 久久99精品视频 | 国产精品视频免费在线观看 | 亚洲黄色av| 久草在线视频看看 | 国产精品入口麻豆 | 久久观看| 欧美天天综合网 | 在线观看 国产 | 午夜视频在线观看网站 | 成 人 免费 黄 色 视频 | 综合av在线| 91精品夜夜 | 欧洲性视频 | 日韩精品一区二区三区三炮视频 | 99精品一级欧美片免费播放 | 精品成人a区在线观看 | 国产精品99久久久 | 狠狠色噜噜狠狠狠合久 | 午夜精品一区二区三区在线视频 | 欧美福利精品 | 玖玖玖精品 | 成人av午夜| 97精品国自产拍在线观看 | 精品中文字幕在线观看 | 欧美日韩国产综合网 | 97电影网站 | 国产原厂视频在线观看 | 久久国产系列 | 日韩国产欧美在线播放 | 五月婷婷久久综合 | 日本久久久久久 | 欧美 日韩 国产 中文字幕 | 久久久久久国产精品亚洲78 | 日韩大片在线免费观看 | 久久久久久久影视 | 三级黄在线 | 久久久久久久久久久影院 | 欧美日韩中文另类 | 久久久性 | 五月网婷婷 | 亚洲 中文字幕av | 精品国产99 | 九九热在线观看视频 | 色婷婷婷 | 国产美女精品视频 | 毛片二区 | 欧美精品乱码久久久久久 | 91成年人视频 | 1024手机基地在线观看 | 国产成人综合图片 | 韩国精品一区二区三区六区色诱 | 久久伊人精品天天 | 国产精品久久久免费看 | 91在线porny国产在线看 | 欧美在线一 | 五月激情丁香图片 | 免费av的网站 | 99精品视频中文字幕 | 国产高清一 | 国产免费不卡 | 国产成人不卡 | 自拍超碰在线 | 在线观看视频精品 | 欧美另类亚洲 | 激情五月婷婷激情 | 在线va视频 | 婷婷亚洲五月色综合 | 偷拍久久久 | 日本午夜在线亚洲.国产 | 国产原创91 | 久久久黄色av | 人人澡人人爽欧一区 | 最近乱久中文字幕 | 国产亚洲精品久久久久久移动网络 | 人人玩人人添人人澡超碰 | 91九色porny蝌蚪视频 | 天天射天天拍 | 日本精品一区二区在线观看 | 激情五月婷婷综合 | 夜夜夜夜夜夜操 | 久久亚洲综合国产精品99麻豆的功能介绍 | a午夜电影 | 国产v视频 | 五月激情五月激情 | www.夜夜操.com| av中文天堂| 国产精品久久久久久久久久久久冷 | 亚洲永久精品一区 | 一级性av | 992tv在线成人免费观看 | 天堂av免费| 天天操天天色天天 | 91成人短视频在线观看 | 在线三级av | 久久桃花网 | 日日草视频 | 精品999 | a久久久久久 | 香蕉久草 | 日本中文字幕在线观看 | 午夜久久福利影院 | 久草在线免费资源站 | 国产九九九视频 | 久久五月激情 | 午夜视频在线网站 | 中文字幕在线观看视频一区二区三区 | 免费视频 你懂的 | 亚洲aⅴ在线 | 日本论理电影 | 992tv在线| 天堂av一区二区 | 91传媒在线播放 | 天天曰夜夜爽 | 综合婷婷丁香 | 国产精品一区在线 | 国产字幕av | 午夜精品一区二区三区免费视频 | 国内精品久久久久 | 麻豆91精品 | 男女精品久久 | 久久久久久高清 | 人人看看人人 | 美女免费视频黄 | 亚洲精品美女 | 午夜视频99| 韩国av永久免费 | 韩国av免费 | a久久久久久 | 亚洲国产精品视频在线观看 | 亚洲色影爱久久精品 | 成人av片在线观看 | 欧美淫aaa免费观看 日韩激情免费视频 | 国产日韩欧美视频在线观看 | 国产一级黄色免费看 | 狠狠色免费 | 亚洲欧洲精品一区二区 | 精品视频久久久久久 | 黄色片免费电影 | 久久综合免费视频影院 | 国产精品va在线观看入 | 中文字幕欧美激情 | 日韩免费中文 | 国产一二区免费视频 | 99九九99九九九视频精品 | 中文字幕免费高清在线观看 | 欧美片一区二区三区 | 日韩精品一区在线播放 | 天堂va欧美va亚洲va老司机 | 天天干,天天操,天天射 | 免费看91的网站 | 日韩在线电影一区 | 欧美日韩免费一区二区 | 久久理论片 | 日本精品视频在线观看 | 2022久久国产露脸精品国产 | 国产视频一二区 | 亚洲精品乱码久久久久久蜜桃动漫 | 91精品免费 | 国产成人精品综合久久久 | 国产成人免费av电影 | 在线日本看片免费人成视久网 | 91片黄在线观看 | 亚洲色图美腿丝袜 | 免费黄在线观看 | 日韩三级视频在线观看 | 日韩亚洲在线观看 | 欧美一区二区三区不卡 | av在线免费观看网站 | 久久草在线视频国产 | 亚洲网站在线看 | 2024av在线播放 | 日本久久免费电影 | 精品国产乱码久久久久久1区二区 | 欧美精品久久人人躁人人爽 | 成人在线观看影院 | 91在线免费观看网站 | 激情av网址 | 国产中文在线播放 | 国产中文在线观看 | 国内揄拍国产精品 | 久久综合九色综合网站 | 伊人天天操| 黄色91免费观看 | 国产精品 国内视频 | 国产区精品区 | 91精品国产99久久久久久久 | 久久久精品综合 | 好看的国产精品视频 | 成人av一区二区兰花在线播放 | 国产手机精品视频 | 国产一区精品在线 | 日韩国产精品毛片 | 国产精品mm | 黄色av免费看 | 日本在线精品视频 | 亚洲免费婷婷 | www.com久久久 | 日韩一级成人av | 久久综合干 | 国产精品久久9 | 国产精品自产拍在线观看中文 | 国产一级大片在线观看 | 欧美少妇影院 | 欧美国产一区二区 | 日韩av资源在线观看 | 伊人久久av| 黄色免费看片网站 | 黄色av三级在线 | 欧美精品久久久久性色 | 91av在线电影 | 久久久久亚洲国产 | 麻豆视频国产在线观看 | 国产精品久久久视频 | 国产在线成人 | 天堂av免费 | 国产精品免费观看久久 | 久久婷婷激情 | 黄色精品视频 | 国产电影黄色av | 一区二区中文字幕在线播放 | 91av免费看 | 久草观看视频 | 日韩一区二区三区不卡 | 日韩欧美一区二区三区视频 | 97香蕉久久超级碰碰高清版 | 91精品导航 | 成人免费一级 | 四虎国产精品免费观看视频优播 | 999成人网 | 精品美女在线观看 | 日本久久免费电影 | 手机av在线不卡 | 91免费版在线 | 天天草天天草 | 色综合久久久久久久久五月 | 免费视频你懂得 | 亚洲伦理一区二区 | 在线观看国产91 | av短片在线观看 | 久久综合色8888 | 国产乱码精品一区二区三区介绍 | 日日夜夜网| 日韩大片在线看 | 伊人久久在线观看 | 亚洲视频免费 | 91av视频导航 | 久久这里有精品 | 色欲综合视频天天天 | 91精品国自产在线偷拍蜜桃 | 国产综合在线观看视频 | 免费观看一级 | 91欧美在线| 69国产精品成人在线播放 | 午夜在线观看影院 | 亚洲国产精品小视频 | 亚洲一区视频在线播放 | 欧美一区二区三区在线观看 | 婷婷久操 | 四虎成人免费观看 | 最近中文字幕完整视频高清1 | 亚洲国产欧美一区二区三区丁香婷 | 人人爱人人爽 | 黄色毛片在线 | 国产成人av福利 | 久久99热这里只有精品 | 国产精品美 | 九九久久视频 | 国产精品久久久久久久久久久杏吧 | 国内成人av | 中文字幕一区二区在线播放 | 亚洲国产美女精品久久久久∴ | 精品国产乱码久久久久久浪潮 | 国产精品不卡在线观看 | 亚洲成av人片在线观看香蕉 | 国产人成在线观看 | 成人免费视频免费观看 | 亚洲国产97在线精品一区 | 久久视频在线免费观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 97视频免费观看 | 久久精品日产第一区二区三区乱码 | 久操视频在线播放 | 亚洲禁18久人片 | 中文字幕资源在线观看 | 国内精品久久久久久 | 久久九九影视 | 久草在线在线精品观看 | 九九九热 | 夜夜操狠狠操 | 欧美日韩中文另类 | 国产一区成人在线 | 久在线观看视频 | 亚洲精品麻豆视频 | 69久久夜色精品国产69 | 久久免费视频一区 | 国产精品久久麻豆 | 黄网站色成年免费观看 | 欧美在线观看小视频 | 婷婷久操 | 亚洲视频www| 国产不卡一二三区 | 色是在线视频 | 日韩在线精品视频 | 精品999久久久 | 在线观看免费观看在线91 | 国产视频 亚洲精品 | www.国产高清 | 18国产精品白浆在线观看免费 | 亚洲日本va午夜在线影院 | 免费av大全| 日韩久久网站 | 国产一级视屏 | 精品国产视频一区 | 2018精品视频 | 日韩精品一区二区三区在线视频 | 国产精品久久久久aaaa | 超碰在线94 | 亚洲特级片 | 久久视频在线 | 国产精品美乳一区二区免费 | 97精品国产91久久久久久久 | 久久久久久高潮国产精品视 | 色婷婷播放 | 欧洲精品视频一区二区 | 亚洲h在线播放在线观看h | 国产视频一区二区在线播放 | 在线观看日韩免费视频 | 久久国产美女视频 | 久久亚洲精品电影 | 精品天堂av | 成人h在线播放 | 亚洲高清在线 | se婷婷| 久久久久二区 | 99热九九这里只有精品10 | a√资源在线 | 91av久久| 国产精品久久精品国产 | 亚洲女人天堂成人av在线 | 日韩av在线网站 | 色婷婷国产精品一区在线观看 | 国产精品99久久久久人中文网介绍 | 在线观看中文av | 狠狠操电影网 | 日韩毛片久久久 | 久久久这里有精品 | av中文字幕在线看 | 精品视频专区 | 91人人爱 | 亚洲最新av在线网址 | 日韩亚洲国产精品 | 久久激情五月丁香伊人 | 欧美日韩精品影院 | 国产自制av| 在线黄色观看 | 国产精品一区二区三区观看 | 久精品视频在线观看 | 国产韩国日本高清视频 | 亚洲永久精品在线观看 | 玖玖视频| 97碰视频| 国产伦精品一区二区三区无广告 | 亚洲欧美少妇 | 欧美成年人在线视频 | 精品国产视频在线 | 一区二区三区精品久久久 | 亚洲午夜不卡 | 亚洲一区二区精品在线 | 精品国产电影一区二区 | 国产一区在线不卡 | 成人精品视频 | 国产91亚洲精品 | 午夜精品av在线 | 日韩影视在线观看 | 亚洲国产经典视频 | 九九爱免费视频在线观看 | 欧美精品你懂的 | 免费在线观看黄网站 | 久久久久久高潮国产精品视 | 亚洲精品国产精品国自 | 免费在线日韩 | 天天干夜夜夜操天 | 久久精品视频5 | 天天色 天天 | 亚洲一区二区视频在线播放 | 欧美大片www| 久久成年人视频 | 免费中文字幕 | 国产无遮挡又黄又爽馒头漫画 | 97视频免费 | 片网站 | 亚洲人片在线观看 | 色偷偷888欧美精品久久久 | 国产伦精品一区二区三区照片91 | 在线国产99| 91免费高清视频 | 天天色天天操天天爽 | 久久这里只有精品首页 | 成人理论电影 | 国产精品美女久久久久久网站 | 成人免费观看电影 | 免费看黄网站在线 | 日本爱爱免费 | 亚洲精品久久久蜜臀下载官网 | 亚洲精品国精品久久99热一 | 97成人精品 | 久久久国产精品亚洲一区 | 精品产品国产在线不卡 | 亚洲激精日韩激精欧美精品 | 狠狠色伊人亚洲综合网站色 | 91免费版在线观看 | 18国产精品福利片久久婷 | 中文电影网 | av免费网站观看 | 欧美一级爽 | 国产在线视频一区二区 | 日韩视频免费观看高清 | 高清av免费看| 91丨九色丨蝌蚪丨对白 | 国产亚洲人成网站在线观看 | 国产一区播放 | 日本aaaa级毛片在线看 | 日韩欧美专区 | av在线等 | 91成版人在线观看入口 | 欧美亚洲国产一卡 | 午夜久久久久久久 | 国产精品伦一区二区三区视频 | 免费麻豆视频 | 亚洲成人黄色 | 国产玖玖在线 | av片在线观看 | 在线观看一区视频 | 国产婷婷vvvv激情久 | 日韩精品视频免费在线观看 | 国产精品亚洲人在线观看 | 最新日韩在线观看视频 | 波多野结衣在线观看一区 | 热久久这里只有精品 | 叶爱av在线 | 国产精品一区二区av麻豆 | 国产精品福利久久久 | 视频在线一区二区三区 | 成人黄在线 | 国产日产欧美在线观看 | 日韩videos| 在线观看午夜av | 草久中文字幕 | 日韩欧美成人网 | 婷婷福利影院 | 免费a级观看 | 中文字幕丝袜一区二区 | 97人人视频 | 97人人模人人爽人人喊网 | 日韩成人免费观看 | 黄色av一级 | 91av大全| 亚洲国产精品推荐 | 69国产在线观看 | 日韩av成人 | 日韩电影中文字幕在线 | 日韩精品视频网站 | 免费涩涩网站 | 国产精品青草综合久久久久99 | 国产精品自产拍 | 综合天天| 99精品视频在线观看播放 | 五月婷婷色播 | a黄色片在线观看 | 9在线观看免费高清完整版在线观看明 | 九九久久久久久久久激情 | 国产一区二区三区免费视频 | 久久久国产精品成人免费 | 九九九毛片 | 日韩在线观看视频一区二区三区 | 日精品 | 最新av网站在线观看 | 91黄视频在线观看 | 国产精品久久久久久久久久免费 | bbb搡bbb爽爽爽 | 激情综合国产 | 亚洲激情五月 | 色多视频在线观看 | www黄色| 婷婷 综合 色 | 丁香激情综合久久伊人久久 | 久久不射电影网 | 日韩最新中文字幕 | 欧美精品国产综合久久 | 国产在线视频在线观看 | 免费影视大全推荐 | 国产伦精品一区二区三区四区视频 | 亚洲播放一区 | 亚洲九九精品 | 成人毛片一区二区三区 | 色成人亚洲网 | 久久大视频 | 国产精品99久久久久久人免费 | 国产系列精品av | 99视频在线观看免费 | 亚洲精品国产拍在线 | 日本免费久久高清视频 | 欧美日韩激情视频8区 | 色综合五月天 | 婷婷亚洲五月 | 综合网天天 | 色综合久久久久久中文网 | 日本巨乳在线 | av中文字幕日韩 | 97人人视频 | 免费久久久久久 | 中文字幕国产一区二区 | 欧美日韩亚洲国产一区 | 久久大视频 | 日韩乱码在线 | 一区二区三区视频在线 | 国产在线国产 | 亚洲精品麻豆 | 日韩免费在线观看网站 | 久久久久观看 | 久久久久麻豆 | 日日夜夜天天久久 | 色www.| 欧美一级激情 | 99热精品国产 | 久久免费在线观看 | 在线观看日韩精品 | 久久9精品 | 国产91精品久久久久久 | 亚洲综合导航 | 免费看麻豆 | 激情av网| 999日韩| 色婷五月 | 国产精品美女久久久久久网站 | 欧美激情精品久久 | 国产精品视频 | 中文字幕精品一区二区三区电影 | 99爱这里只有精品 | 国产视频亚洲 | 日本在线观看中文字幕无线观看 | 久久96国产精品久久99软件 | 国产字幕av | 麻豆视传媒官网免费观看 | 日韩在线观看第一页 | 香蕉视频在线免费 | 精品国产色 | 性色在线视频 | 夜夜婷婷 | 成人在线免费观看网站 | 久久艹影院 | 日韩av电影一区 | 亚洲在线观看av | 亚洲无人区小视频 | 99精品亚洲 | www.福利视频| 国产一区欧美一区 | 又湿又紧又大又爽a视频国产 | 国产高清免费在线观看 | 99国产视频在线 | 岛国av在线不卡 | 五月婷婷久久丁香 | 中文字幕乱码日本亚洲一区二区 | 免费一区在线 | 成人av资源网 | 国产99中文字幕 | 欧美日韩99 | 欧美日韩精品在线视频 | 成年人在线视频观看 | 免费福利视频网站 | 久久精品国产成人精品 | 国产激情电影综合在线看 | 中文字幕色综合网 | 亚洲日本在线一区 | 黄色av高清| 最新久久免费视频 | 国产一区二区综合 | 又黄又刺激的网站 | 天天摸夜夜操 | 四虎影视成人精品 | 日韩免费在线 | 好看的国产精品视频 | 欧美日韩国产亚洲乱码字幕 | 日韩成人黄色 | 日本久久精 | 五月婷婷六月丁香 | 区一区二在线 | 久久久久国产成人免费精品免费 | 中文字幕一区二区三区四区 | 国产区精品在线观看 | 黄色片视频免费 | 亚洲美女精品区人人人人 | 久久久国产影院 | 久久久99精品免费观看 | 国产专区在线视频 | 欧美乱淫视频 | 韩国一区二区在线观看 | 亚洲黄色app| 91视频91色| 亚洲综合涩 | 人人cao| 天天操欧美 | 国产理论影院 | 久草免费新视频 | 成年人免费在线播放 | 激情丁香 | 中文字幕av网站 | 999视频网站| 精品一区二区免费在线观看 | 国产精品久久久久影院日本 | 9在线观看免费高清完整版在线观看明 | 亚洲精品资源在线观看 | 日韩综合在线观看 | 久久五月情影视 | 欧美成人手机版 | 日韩二区在线播放 | 婷婷色在线视频 | 免费高清在线视频一区· | 国产精品久久久久一区二区国产 | 国产视频一区在线播放 | 91色蜜桃| 久久国产精品99久久久久久丝袜 | 欧美日本三级 | 国产福利av在线 | 一区 在线 影院 | 91粉色视频| 亚洲视频1区2区 | 午夜精品久久久99热福利 | 亚洲欧美日韩精品久久奇米一区 | 500部大龄熟乱视频 欧美日本三级 | av免费看在线 | 在线观看国产www | 国产99久久久欧美黑人 | 久久av中文字幕片 | 国产精品99蜜臀久久不卡二区 | 有码中文在线 | 久久深夜福利免费观看 | 色噜噜日韩精品一区二区三区视频 | 久久成视频 | 亚洲国产合集 | 中文在线免费观看 | 国产午夜三级 | 91免费版成人 | 日韩免费 | 高清av免费看 | 国产精品久久久久久久99 | 激情五月开心 | 欧美日韩后 | japanesexxxxfreehd乱熟| 国产亚洲综合精品 | a天堂最新版中文在线地址 久久99久久精品国产 | 男女拍拍免费视频 | 亚洲精品成人在线 | 韩国在线一区 | 色94色欧美 | 国产精品久久久久久久久久久久午夜片 | 欧美大片在线观看一区 | 黄色大片免费播放 | 色偷偷网站视频 | 处女av在线| 国产一级黄色电影 | 中文字幕在线观看免费观看 | 国产手机在线 | 国产精品免费久久久久影院仙踪林 | 波多野结衣电影一区 | 久草五月 | 国产成人久久久久 | 精品国产aⅴ麻豆 | 日韩久久视频 | 探花视频免费在线观看 | 久久久久成人精品 | 黄色一级动作片 | 精品国产一区二区三区男人吃奶 | 国产婷婷一区二区 | 亚洲精品乱码白浆高清久久久久久 | 中文字幕成人在线观看 | 91免费在线看片 | 在线观看国产www | 狠狠色噜噜狠狠 | 午夜视频久久久 | 国产人成在线视频 | 久久久久久久久久久高潮一区二区 | 日韩亚洲欧美中文字幕 | 国产精品99久久久久久小说 | 69国产精品视频 | 天天se天天cao天天干 | 96亚洲精品久久久蜜桃 | 开心激情五月网 | 中文字幕电影网 | 黄色片软件网站 | 国产在线观看免费观看 | 一区二区三区精品久久久 | www.色综合.com | 久草在线最新 | 五月婷婷网站 | 亚洲黄色成人 | 国产手机在线 | 国产成人av电影在线观看 | 国语对白少妇爽91 | 91成人精品| 激情五月六月婷婷 | 免费观看www视频 | 日韩区欠美精品av视频 | 精品视频免费久久久看 | 色多多视频在线观看 | 久久综合欧美 | 国产精品美女久久久网av | 黄色大片日本 | 日韩有码中文字幕在线 | 国产黄色片一级 | 波多野结衣电影一区 | av免费在线看网站 | 日韩两性视频 | 亚洲成人国产精品 | 国产中文欧美日韩在线 | 亚洲黄色在线 | 亚洲国产日韩欧美在线 | 99中文字幕视频 | 久久丝袜视频 | 四虎在线永久免费观看 | 成年人看片 | 国产精品久久久久久麻豆一区 | 在线观看av麻豆 | 国产乱老熟视频网88av | 美女黄濒 | 天天爽夜夜爽精品视频婷婷 | 日韩中文字幕在线看 | 最新日本中文字幕 | 精品视频免费观看 | 国产精品自在线 | 久久精品区| 顶级bbw搡bbbb搡bbbb | 深爱激情五月综合 | 欧美性色综合网 | 成年人网站免费在线观看 | 国产视频在线一区二区 | 日本三级香港三级人妇99 | 色婷婷综合视频在线观看 | 免费高清在线视频一区· | 91热爆在线观看 | 亚洲一级国产 | 手机av永久免费 | 日韩 在线a | 日韩成人av在线 | 99精品在线视频观看 | 日韩久久久久久久久久 | 国产精品v欧美精品 | 91精品国产99久久久久久久 | 国产中文字幕免费 | 亚洲在线成人精品 | 亚洲精品自拍视频在线观看 | 蜜臀一区二区三区精品免费视频 | 亚洲一级二级三级 | 成人免费影院 | 久久久91精品国产一区二区精品 | 欧美黄色软件 | 久久久久久久久久久久av | 91污视频在线观看 | 成人黄色毛片视频 | 久9在线 | 亚洲天堂色婷婷 | 激情综合中文娱乐网 | 欧美激情在线看 | 九九色综合 | 黄色a大片 | 人人爽人人爽人人爽学生一级 | 91中文字幕永久在线 | 伊人六月 | 男女啪啪网站 | 亚洲精品乱码久久久久久按摩 | 伊人资源站 | 亚洲精品动漫久久久久 | 欧美精品在线视频 | 五月婷久| 毛片网站在线看 | 91热| 欧美一区二区在线 | 天天射天天爽 | 在线观看黄网 | 久草热视频| 91麻豆精品国产自产 | 天天天干夜夜夜操 | 黄色一级动作片 | 久久99国产综合精品 | 91视频电影| 黄色电影在线免费观看 | 亚洲精品国产精品久久99热 | 久久av免费 | 激情网五月婷婷 | 亚洲成人免费在线观看 | 成人欧美一区二区三区黑人麻豆 | 一本一本久久a久久精品综合小说 | 成人免费av电影 | 国内久久久久久 | 最新影院 | 九九爱免费视频 | 亚洲一区二区视频在线 | 免费看短 | 国产精品久久久久久久久久久久冷 | 天天射日| 五月婷在线 | 丁香婷婷在线 | 国产精品久久久久久爽爽爽 | 国产探花视频在线播放 | 国产一级免费av | 久久精品999 | 国产一级黄大片 | 久久黄色片 | 香蕉视频网址 | 国产麻豆视频在线观看 | 亚洲日本色| 超碰在线观看97 | 人成午夜视频 | 国产中文字幕网 | 日韩一级片大全 | 99国产精品久久久久久久久久 | 91久久影院 | 中文字幕视频在线播放 | 4438全国亚洲精品在线观看视频 | 尤物97国产精品久久精品国产 | 久久综合视频网 | 婷婷久久综合网 | 国产一区欧美在线 | 国产超碰在线 | 久久999久久 | 日日精品 | 日韩欧美高清一区二区三区 | 深夜福利视频在线观看 | 国产无限资源在线观看 | 久久国内精品视频 | 欧美淫aaa免费观看 日韩激情免费视频 | 综合在线色 | 国产96在线视频 | 97成人在线观看 | 国产福利91精品一区二区三区 | 女人18片毛片90分钟 | 超碰97网站 | 亚洲综合射 | 97视频免费观看 | 日韩啪啪小视频 | 久久伦理电影 | 久久精品亚洲综合专区 | 在线成人短视频 | www.久久99| 成人四虎 |