Vulkan Samples 阅读 -- Extensions(二)
目录
- Conditional Rendering
- prepare
- render
- shader
- 小结
- Debug Markers
- Negative Viewport Height
- prepare
- render
- shader
- 小结
- Variable Rate Shading
- prepare
- render
- shader
- 小结
Conditional Rendering
prepare
- loadAssets:加载模型(有很多部件组成)\
- prepareConditionalRendering: 条件渲染重点设置
- vkCmdBeginConditionalRenderingEXT
- 加载扩展
- vkCmdEndConditionalRenderingEXT
- 加载扩展
- 创建 Conditional Rendering 使用的缓冲区, 条件数值类型为32 bits,如果为零,则放弃渲染命名.
- createBuffer: std::vector<int32_t> conditionalVisibility;
- loop: 初始化条件为true
- conditionalVisibility[i] = 1;
- updateConditionalBuffer
- memcpy : 复制数据
- vkCmdBeginConditionalRenderingEXT
- prepareUniformBuffers
- createBuffer
- updateUniformBuffers
- setupDescriptorSets
- vkCreateDescriptorPool
- vkCreatePipelineLayout
- vkAllocateDescriptorSets
- writeDescriptorSet
- vkUpdateDescriptorSets
- setupDescriptorSetLayout
- descriptorSetLayoutBinding
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- preparePipelines
-vkCreateGraphicsPipelines - buildCommandBuffers
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindDescriptorSets
- vkCmdBindPipeline
- vkCmdBindVertexBuffers
- vkCmdBindIndexBuffer
- renderNode: 本节重点, 设置条件渲染和常量
- loop mesh
- vkCmdBindDescriptorSets
- vkCmdPushConstants
- Setup the conditional rendering
- VkConditionalRenderingBeginInfoEXT
- vkCmdBeginConditionalRenderingEXT
- vkCmdDrawIndexed
- vkCmdEndConditionalRenderingEXT
- loop mesh
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- 重写 OnUpdateUIOverlay
- 修改conditionalVisibility[i] 的值
- updateConditionalBuffer 即可
- loop
render
- draw
- prepareFrame
- vkQueueSubmit
- submitFrame
- updateUniformBuffers
shader
- 正常渲染模型即可, 注意常量的使用
小结
本节主要讲 Conditional Rendering 扩展使用方法。 该参数在prepare中初始化, 在渲染循环中更新.
Debug Markers
接口弃用, 暂时忽略, 后期补充
Negative Viewport Height
prepare
- loadAssets:加载两张贴图, 创建两个y值相反的四边形
- setupDescriptors
- descriptorSetLayoutBinding
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- vkCreateDescriptorPool
- vkAllocateDescriptorSets
- writeDescriptorSet
- vkUpdateDescriptorSets
- preparePipelines
-vkCreateGraphicsPipelines - buildCommandBuffers
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- Viewport setup: 本节重点
- VkViewport viewport{}
- if negativeViewport
- yes
- viewport.y = (float)height - offsety;
- viewport.height = -(float)height;
- no
- viewport.y = offsety;
- viewport.height = (float)height;
- yes
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindDescriptorSets
- vkCmdBindIndexBuffer
- vkCmdBindVertexBuffers
- vkCmdDrawIndexed
- vkCmdBindDescriptorSets
- vkCmdBindIndexBuffer
- vkCmdDrawIndexed
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- 重写 OnUpdateUIOverlay
- 根据界面选择渲染方式重写创建commandbuffer和pipeline
- buildCommandBuffers
- preparePipelines
- 根据界面选择渲染方式重写创建commandbuffer和pipeline
- loop
render
- draw
- prepareFrame
- vkQueueSubmit
- submitFrame
shader
- 正常渲染模型即可
小结
本节主要讲兼容其他渲染管线的设置方法, 实际开发中经常遇到这种情况, vulkan建议的处理方式是, 重新创建commandbuffer 和 pipeline.
Variable Rate Shading
prepare
- loadAssets:加载场景资源
- 开启ShadingRate扩展
- vkCmdBindShadingRateImageNV
- vkGetDeviceProcAddr
- vkGetPhysicalDeviceProperties2
- vkCmdBindShadingRateImageNV
- prepareShadingRateImage: 本節重點
- 着色率图像大小取决于着色率纹理大小
- kExtent3D imageExtent
- vkCreateImage
- vkGetImageMemoryRequirements
- vkAllocateMemory
- vkBindImageMemory
- vkCreateImageView
- 使用尽可能低的着色速率填充图案
- memset(shadingRatePatternData, val, bufferSize)
- 创建一个向外降低采样率的圆形图案
- std::map<float, VkShadingRatePaletteEntryNV> patternLookup
- vkCreateBuffer: stagingBuffer
- vkGetBufferMemoryRequirements
- vkAllocateMemory
- vkBindBufferMemory
- vkMapMemory
- memcpy
- vkUnmapMemory
- delete[] shadingRatePatternData
- Upload
- createCommandBuffer
- vkCmdPipelineBarrier
- vkCmdCopyBufferToImage
- vkCmdPipelineBarrier
- flushCommandBuffer
- vkFreeMemory
- vkDestroyBuffer
- prepareUniformBuffers
- updateUniformBuffers
- setupDescriptors
- descriptorSetLayoutBinding
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- vkCreateDescriptorPool
- vkAllocateDescriptorSets
- writeDescriptorSet
- vkUpdateDescriptorSets
- preparePipelines
- SpecializationData: 一個特殊的常量
- specializationMapEntry:alphaMask
- specializationMapEntry:alphaMaskCutoff
- shaderStages[1].pSpecializationInfo = &specializationInfo
- Create pipeline without shading rate
- vkCreateGraphicsPipelines
- vkCreateGraphicsPipelines
- Create pipeline with shading rate enabled: 本節重點
- const std::vector shadingRatePaletteEntries
- VkShadingRatePaletteNV
- VkPipelineViewportShadingRateImageStateCreateInfoNV
- vkCreateGraphicsPipelines
- vkCreateGraphicsPipelines
- SpecializationData: 一個特殊的常量
- buildCommandBuffers
- loop
- vkBeginCommandBuffer
- vkCmdBeginRenderPass
- vkCmdSetViewport
- vkCmdSetScissor
- vkCmdBindDescriptorSets
- Bind the image that contains the shading rate patterns
- vkCmdBindShadingRateImageNV
- Render the scene: enableShadingRate選擇pipeline
- vkCmdBindPipeline
- draw
- vkCmdBindPipeline
- draw
- drawUI
- vkCmdEndRenderPass
- vkEndCommandBuffer
- 重写 OnUpdateUIOverlay
- buildCommandBuffers
- loop
render
- renderFrame
- prepareFrame
- vkQueueSubmit
- submitFrame
- updateUniformBuffers
shader
- VS: 正常渲染
- FS:
- 開啓采樣率擴展
- #extension GL_NV_shading_rate_image : require
- 常量的獲取
- layout (constant_id = 0) const bool ALPHA_MASK = false;
- layout (constant_id = 1) const float ALPHA_MASK_CUTOFF = 0.0f;
- gl_FragmentSizeNV:读取以像素为单位的有效片段大小
- 開啓采樣率擴展
小结
本节主要讲Variable Rate Shading 设置方法, 自己的翻译可能不是很恰当, 但是感觉网络上的翻译也不是太合适, 这是一个近几年提出的概念. 从本节程序上看, 开启采样率扩展能提高渲染的性能. 同时渲染结果的质量会变差. 毕竟这有点像可控降采样.
Vulkan Samples 阅读 -- Extensions(二)相关推荐
- 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 ...
- 大型网站技术架构:核心原理与案例分析阅读笔记二
大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...
- 【渝粤题库】陕西师范大学201661英语阅读(二)作业(高起专)
陕西师范大学 内 部 题 库 教育 (yuyueshool) 编制 <阅读(二)>作业 I.Words DIRECTIONS: Read the sentence given with e ...
- Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索
Alibaba Druid 源码阅读(二) 数据库连接池实现初步探索 简介 在上篇文章中,了解了连接池的应用场景和本地运行了示例,本篇文章中,我们尝试来探索下Alibaba Druid数据库连接池的整 ...
- Soul 网关源码阅读(二)代码初步运行
Soul 源码阅读(二)代码初步运行 简介 基于上篇:Soul 源码阅读(一) 概览,这部分跑一下Soul网关的示例 过程记录 现在我们可以根据地图,稍微探索一下周边,摸一摸 ...
- SURF C++代码 详细阅读(二)—— 极值点检测 确定极值点精确位置
SURF C++代码详细阅读(二) 2.2.3 极值点检测 2.2.4 确定极值点精确位置 2.3 新建自定义Ipoint类获得特征点 阅读(一)进行到了 2.2.2 获取特征点 buildRespo ...
- 《挑战程序设计竞赛》阅读笔记二 之 ALDS1_2_C Stable Sort
<挑战程序设计竞赛>阅读笔记二 之 ALDS1_2_C Stable Sort 第三章 Sort I ALDS1_2_C Stable Sort 这道题目,就是为了说明 冒泡排序是稳定排序 ...
- 【LeGO-LOAM论文阅读(二)--特征提取(二)】
简介 上篇博客介绍了特征提取的原理以及坐标转化和插值的源码理解,这篇将介绍特征提取的后续算法模块. 源码 1.新数据进来进行坐标转换和插补等工作 见[LeGO-LOAM论文阅读(二)–特征提取(一)] ...
- 如何批量制作扫描后即可在线阅读的二维码
由于二维码在日常生活中应用比较广泛,因此受到很多行业的青睐.随着手机功能的增强,我们平时会使用手机上网,甚至连一些报纸行业也开始进军互联网行业,而它们的媒介就是二维码.读者可以通过手机对报纸上的二维码 ...
最新文章
- jvm类加载过程_JVM知识点——深入理解JVM的类加载
- 动态配置页面 之 组件系统
- 本地jar文件中搜索class
- Internet Explorer 11:不要再叫我IE
- Java 8和Java 14之间的新功能
- [css] 为什么要使用css sprites?
- loadrunner学习记录一
- 动态代理Java实现
- 用友发布新一代价值分析型eHR软件
- 【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察
- CSDN中使用编辑器空格
- socket编程(五)
- UVA11968 In The Airport【最值】
- 绿色版飞信LibFetion提示用户密码错误的解决办法,直接改用飞信号登录即可
- 如何建立能力评估模型?
- ubuntu状态栏消失
- 秒杀脚本丨Python淘宝或京东等秒杀抢购脚本实现
- 数据科学库(HM)(Day2)——matplotlib常用统计图
- Vmware虚拟机ip为127.0.0.1的解决办法,修改虚拟机IP的详细步骤
- springboot项目docker部署(1) 基础:手动打包