Vulkan Samples 阅读 -- Basics(四): Texture Arrays Cube Map Textures 3D Textures
目录
- Texture Arrays
- prepare
- render
- 小结
- Cube Map Textures
- prepare
- render
- 小结
- 3D Textures
- prepare
- render
- 小结
Texture Arrays
prepare
- loadAssets: 加载纹理
- ktx_uint8_t *textureData 从读图API中将纹理读入
- vkCreateBuffer: 创建stagingBuffer
- vkGetBufferMemoryRequirements: 申请buffer使用的内存
- vkAllocateMemory: 分配内存
- vkBindBufferMemory: 绑定内存
- vkMapMemory – memcpy – vkUnmapMemory: 将纹理信息复制到 host local staging buffer (specific layout)
- std::vector bufferCopyRegions: 这里上节是绑定 mipmap 的, 这里 Texture Arrays 也是根据 layerCount 写入vector中.
- vkCreateImage: Create optimal tiled target image on the device
- 其中主要的是 imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
- vkGetImageMemoryRequirements: 申请内存
- vkAllocateMemory: 分配内存
- vkBindImageMemory: 绑定资源
- createCommandBuffer:创建复制命令
- VkImageSubresourceRange: layerCount 定义为数组的个数
- setImageLayout: 即 imageMemoryBarrier
- vkCmdCopyBufferToImage:Copy mip levels from staging buffer
- setImageLayout:从TRANSFER Barrier 到 FRAGMENT_SHADER
- flushCommandBuffer
- vkCreateSampler
- vkCreateImageView
- vkFreeMemory:Clean up staging resources
- vkDestroyBuffer:Clean up staging resources
- ktxTexture_Destroy:释放从磁盘读取图片的内存
- generateCube:创建一个立方体
- prepareUniformBuffers
- createBuffer
- 创建 UniformBuffer: 根据纹理数组个数申请 buffer size
- vkMapMemory – memcpy – vkUnmapMemory: 更新 buffer 中数据
- updateUniformBuffersCamera
- createBuffer
- setupDescriptorSetLayout
- preparePipelines
- setupDescriptorPool
- setupDescriptorSet: 这里需要对纹理数据描述符进行绑定
// Image descriptor for the texture arrayVkDescriptorImageInfo textureDescriptor =vks::initializers::descriptorImageInfo(textureArray.sampler,textureArray.view,textureArray.imageLayout);
- buildCommandBuffers
- shader 中获取Texture Array
layout (binding = 1) uniform sampler2DArray samplerArray; ------------------------- outFragColor = texture(samplerArray, inUV);
render
- draw
- updateUniformBuffersCamera
小结
Texture Array 与 mipmap 绑定相似。不同的是Texture Array 还需在setupDescriptorSet 中进行设置。这样 shader 才能使用 sampler2DArray 获取纹理。
Cube Map Textures
prepare
- loadAssets:
- 加载模型
- 加载cubmap
- ktx_uint8_t *textureData 从读图API中将纹理读入
- 创建 staging buffer:步骤都一样这里不重复了
- std::vector bufferCopyRegions: 这里上节是绑定 mipmap 的, 这里 Texture Arrays 也是根据 layerCount 写入vector中.
- vkCreateImage: Create optimal tiled target image on the device
- 其中主要的是 imageCreateInfo.arrayLayers = 6;
- imageCreateInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
- vkGetImageMemoryRequirements - vkAllocateMemory - vkBindImageMemory
- createCommandBuffer:创建复制命令
- bufferCopyRegion:中需要cub的6个纹理以及它的mipmap
- VkImageSubresourceRange: layerCount 定义为6
- setImageLayout: 即 imageMemoryBarrier
- vkCmdCopyBufferToImage:Copy mip levels from staging buffer
- setImageLayout:从TRANSFER Barrier 到 FRAGMENT_SHADER
- flushCommandBuffer
- vkCreateSampler
- vkCreateImageView
- view.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
- view.subresourceRange.layerCount = 6;
- view.subresourceRange.levelCount = cubeMap.mipLevels;
- vkFreeMemory:Clean up staging resources
- vkDestroyBuffer:Clean up staging resources
- ktxTexture_Destroy:释放从磁盘读取图片的内存
- prepareUniformBuffers
- createBuffer
- updateUniformBuffers
- setupDescriptorSetLayout
- preparePipelines
- 需要多加一个 渲染 CUBMAP Pipeline
- setupDescriptorPool
- setupDescriptorSet: 这里需要对纹理数据描述符进行绑定
// Image descriptor for the cube map textureVkDescriptorImageInfo textureDescriptor =vks::initializers::descriptorImageInfo(cubeMap.sampler,cubeMap.view,cubeMap.imageLayout);
- buildCommandBuffers
- shader 中获取Texture Array
layout (binding = 1) uniform samplerCube samplerCubeMap;; ------------------------- outFragColor = texture(samplerCubeMap, inUVW);
render
- draw
小结
Cube Map Textures 其实就是 6个纹理组成的Texture Array, shader 使用 samplerCube 获取纹理。
3D Textures
prepare
- generateQuad
- setupVertexDescriptions
- prepareUniformBuffers
- createBuffer
- updateUniformBuffers
- prepareNoiseTexture
- VkImageCreateInfo: .imageType = VK_IMAGE_TYPE_3D
- vkCreateImage
- vkGetImageMemoryRequirements-vkAllocateMemory-vkBindImageMemory
- vkCreateSampler
- VkImageViewCreateInfo: view.viewType = VK_IMAGE_VIEW_TYPE_3D
- vkCreateImageView
- updateNoiseTexture: 就是向纹理写入随机数据
- stagingBuffer
- vkCreateBuffer-vkGetBufferMemoryRequirements-vkAllocateMemory-vkBindBufferMemory
- vkMapMemory-memcpy-vkUnmapMemory
- createCommandBuffer
- setImageLayout-vkCmdCopyBufferToImage-setImageLayout
- flushCommandBuffer
- stagingBuffer
- vkFreeMemory
- vkDestroyBuffer
- setupDescriptorSetLayout
- preparePipelines
- setupDescriptorPool
- setupDescriptorSet
- buildCommandBuffers
- shader 中获取Texture Array
layout (binding = 1) uniform sampler3D samplerColor; ------------------------- vec4 color = texture(samplerColor, inUV);
render
- draw
- updateUniformBuffers
小结
3D Textures 很像Texture Array, shader 使用 sampler3D 获取纹理。
Vulkan Samples 阅读 -- Basics(四): Texture Arrays Cube Map Textures 3D Textures相关推荐
- Vulkan Samples 阅读 -- Extensions(二)
目录 Conditional Rendering prepare render shader 小结 Debug Markers Negative Viewport Height prepare ren ...
- Vulkan Samples 阅读 -- Hardware Accelerated Ray Tracing(一) Basic Ray Tracing Ray Traced Shadows
目录 Basic Ray Tracing prepare render shader 小结 Ray Traced Shadows prepare render shader 小结 Basic Ray ...
- 深度学习论文阅读(四):GoogLeNet《Going Deeper with Convolutions》
深度学习论文阅读(四):GoogLeNet<Going Deeper with Convolutions> Abstract 摘要 1.Introduction 引言 2. Related ...
- ExtJS4 API文档阅读(四)——Data
2019独角兽企业重金招聘Python工程师标准>>> ExtJS4 API文档阅读(四)--Data 数据 Data包负责加载和保存你应用程序中的所有数据,由41个类构成,其中有三 ...
- Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索
Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索 简介 上文中分析了数据库连接池的初始化部分,接下来我们来看看获取连接部分的代码 数据库连接池中连接获取 下面的相关的代码,在代码 ...
- Soul 网关源码阅读(四)Dubbo请求概览
Soul 网关源码阅读(四)Dubbo请求概览 简介 本次启动一个dubbo服务示例,初步探索Soul网关源码的Dubbo请求处理流程 示例运行 环境配置 在Soul源码clone下来 ...
- 语文阅读教学“四何”问题设计
转:https://www.fx361.com/page/2019/0916/5548386.shtml "四何"问题是"是何""为何"&q ...
- JS高级程序设计——阅读笔记四
JS高级程序设计--阅读笔记四 第六章 集合引用类型 6.1 Object 6.2 Array 6.2.1 创建数组 from()函数 6.2.2 数组空位 6.2.3 数组索引 6.2.4 检测数组 ...
- Cube Map 系列之:手把手教你 实现天空盒(Sky Box)
什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to lo ...
- 四种方法使Map线程安全
四种方法使Map线程安全 如果需要使 Map 线程安全,大致有这么四种方法: 1.使用 synchronized 关键字,这也是最原始的方法.代码如下 synchronized(anObject) { ...
最新文章
- NOIP2018TG 初赛复习
- 第四章:Spring项目文件上传两种方式(全解析)
- linux c 字符串查找函数 strstr strcasestr
- Android 实现简单的插件化模块化
- phpcmsv9mysql扩展_phpcmsV9升级到php7.1+mysql5.6+nginx1.9迁移步骤nginx中文伪静态rewrite配置...
- 一般控制矩阵转能控标准型
- 浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法
- Ubuntu下使用UFW配置防火墙(简化iptables的操作)
- 华为MDC调试工具使用介绍
- 添加负载机_从 Coco 转向 Koko,Jumpserver 堡垒机 V1.5.3 发布
- python3语法学习第四天--字符串
- 怎么用计算机知道密码,如何用电脑看到自家路由器的密码
- [转] React之Immutable学习记录
- requests库手工识别验证码登录超星泛雅
- 测试分析报告(GB8567——88)基于协同的在线表格forture-sheet
- 北京计算机游戏专业排名2015,2015大学专业排行榜_大学最佳专业排行榜_游戏专业怎么样_52PK游戏网...
- Python BDD 框架之lettuce
- 自考那些事儿(五):软件开发工具(实践篇)
- java lodop打印_[Java教程]LODOP打印插件
- android banner 广告,Android convinientbanner顶部广告轮播控件使用详解