大家好,接下来将为大家介绍Vulkan shader编译。

一、编译shader

在项目根目录下创建一个子目录,名shaders用于存储顶点着色器文件shader.vert和片段着色器文件shader.frag。GLSL着色器官方没有约定的扩展名,但是这两个扩展名是比较普遍通用的。

shader.vert内容如下:

#version 450
#extension GL_ARB_separate_shader_objects : enableout gl_PerVertex {vec4 gl_Position;
};layout(location = 0) out vec3 fragColor;vec2 positions[3] = vec2[](vec2(0.0, -0.5),vec2(0.5, 0.5),vec2(-0.5, 0.5)
);vec3 colors[3] = vec3[](vec3(1.0, 0.0, 0.0),vec3(0.0, 1.0, 0.0),vec3(0.0, 0.0, 1.0)
);void main() {gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);fragColor = colors[gl_VertexIndex];
}

shader.frag文件内容如下:

#version 450
#extension GL_ARB_separate_shader_objects : enablelayout(location = 0) in vec3 fragColor;layout(location = 0) out vec4 outColor;void main() {outColor = vec4(fragColor, 1.0);
}

现在我们尝试使用glslangValidator程序编译SPIR-V二进制码。

Windows

创建一个compile.bat批处理文件,内容如下:

C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.vert
C:/VulkanSDK/1.0.17.0/Bin32/glslangValidator.exe -V shader.frag
pause

glslangValidator.exe的path路径替换为你的VulkanSDK安装路径,然后双击该文件运行。

End of platform-specific instructions

这两个命令使用-V标志调用编译器,该标志告诉它将GLSL源文件编译为SPIR-V字节码。运行编译脚本时,会看到创建了两个SPIR-V二进制文件:vert.spvfrag.spv。这些名称从着色器中派生而来,但是可以重命名为任何名字。在编译着色器时,可能收到关于某些功能缺失的警告信息,在这里放心的忽略它们。

如果着色器包含语法错误,那么编译器会按照您的预期告诉具体的行号和问题。尝试省略一个分号,然后重新运行编译脚本。还可以尝试运行编译器,而无需任何参数来查看它支持哪些类型的标志。例如,它可以将字节码输出为可读的格式,以便准确了解着色器正在执行的操作以及在此阶段应用的任何优化。

二、加载shader

现在我们有一种产生SPIR-V着色器的方法,是时候加载它们到我们的程序中,以便在适当的时候插入到图形管线中。首先我们编写一个辅助函数用以加载二进制数据文件。

#include <fstream>...static std::vector<char> readFile(const std::string& filename) {std::ifstream file(filename, std::ios::ate | std::ios::binary);if (!file.is_open()) {throw std::runtime_error("failed to open file!");}
}

readFile函数将会从文件中读取所有的二进制数据,并用std::vector字节集合管理。我们使用两个标志用以打开文件:

  • ate:在文件末尾开始读取
  • binary:以二进制格式去读文件(避免字符格式的转义)

从文件末尾开始读取的优点是我们可以使用读取位置来确定文件的大小并分配缓冲区:

size_t fileSize = (size_t) file.tellg();
std::vector<char> buffer(fileSize);

之后我们可以追溯到文件的开头,同时读取所有的字节:

file.seekg(0);
file.read(buffer.data(), fileSize);

最后关闭文件,返回字节数据:

file.close();return buffer;

我们调用函数createGraphicsPipeline加载两个着色器的二进制码:

void createGraphicsPipeline() {auto vertShaderCode = readFile("shaders/vert.spv");auto fragShaderCode = readFile("shaders/frag.spv");
}

确保着色器正确加载,并打印缓冲区的大小是否与文件实际大小一致。

Vulkan shader编译相关推荐

  1. 关于Unity 5.x Lightmap Shader 编译过慢的分析

    关于Unity 5.x Lightmap Shader 编译过慢的分析 缘起 最近在研究Unity 5.x 的 Lightmapping 与 场景打包的相关的知识.发现坑深啊.关于怎么打包怎么用网上的 ...

  2. Unity在OpenGL模式下Shader编译报错

    报错信息 GLSL compilation failed: 0(21) : error C7528: OpenGL reserves names containing '__' 双击报错VS自动打开V ...

  3. Unity shader 编译指令

    程序片段被写在CGPROGRAM和ENDCG之间:在程序片段被编译之前需要个程序加上预编译(#pragma). 一.顶点着色器和片段着色器的编译指令 1.#pragma vertex name:编译n ...

  4. 对Unity一个Shader编译Bug的分析(Unrecognized sampler 'samplerunity_lightmap)

    写在前面 Unity的用户量越来越大,越来越有钱,这几年摊子也铺的越来越大,所以各个版本总是有很多Bug.对于一些Bug官方在ReleaseNote里的说明是很不详细的,而对于一些渲染相关的Bug,有 ...

  5. HLSL CG 与glsl着色器编译及其原理

    导言:公司旧的渲染引擎用的结构无语了,要写一个渲染特效现在Unity 用shaderlab实现调试好,Unity插件导出GLTF格式(shader等已经包含在材质信息中),然后再导到自研引擎(用的OP ...

  6. 在win10+VS2019上编译支持Vulkan SDK的ncnn

    目录 Vulkan SDK下载与安装 nvidia显卡驱动更新 支持Vulkan的ncnn编译 参考官方:FAQ ncnn vulkan · Tencent/ncnn Wiki 事先说明,之前我编译过 ...

  7. pytorch 矩阵相乘_编译PyTorch静态库

    背景 众所周知,PyTorch项目作为一个C++工程,是基于CMake进行构建的.然而当你想基于CMake来构建PyTorch静态库时,你会发现: 静态编译相关的文档不全: CMake文件bug太多, ...

  8. Vulkan学习(一)介绍

    1.Vulkan是什么 Vulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯组织在2015年游戏开发者大会(GDC)上发表. 它是 AMD Mantle 的后续版本,继承了前者 ...

  9. openGL、D3D、vulkan区别简介

    跨平台之王--OpenGL OpenGL发展至今,已经有20余年,作为一个成熟并久负盛名的跨平台计算机图形应用程序接口规范,它被广泛使用在游戏.影视.军事.航空航天.地理.医学.机械设计,以及各类科学 ...

最新文章

  1. 蛋白Ramachandran(拉氏图、拉曼图)的绘制和可视化
  2. winphone8 模拟器设置(新)
  3. Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法
  4. PLSQL_解析过程及硬解析和软解析的区别(案例)
  5. 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距...
  6. 数目nullRQNOJ-302-统计单词个数--区域dp
  7. mysql中的isnull
  8. 通过接口操作MyBatis及数据库配置文件
  9. Mac 配置jupyter notebook 扩展 Nbextensions
  10. pytorch from_numpy
  11. Eclipse添加maven之后报错 Eclipse is running in a JRE, but a JDK is required 解决方法
  12. Xilisoft iPad Magic Platinum for Mac一键下载在线视频并将其转换为 iPad?
  13. ios人脸照片_iOS10照片人脸识别功能是什么?iOS10照片人脸识别功能使用教程
  14. 十天学会单片机Day4串行口通信
  15. 15个简单的JS编码标准让你的代码更整洁
  16. 全国计算机等级考试怎么保存,全国计算机等级考试一级备考:Word文档保存为PDF文件...
  17. 信息系统项目管理师 - 项目组合管理
  18. 【wpa_supplicant】 初始化
  19. JSP打开是源码解决
  20. Android应用推广渠道分享

热门文章

  1. web 设计 暑期课笔记 Ⅱ CRAP设计理论
  2. 让AI护理医疗:解决卫生系统的痛点
  3. SURF与SIFT比较
  4. 爬取中关村产品报价网站
  5. 计算机网络基础:5 局域网技术
  6. 国考省考行测:标题选择题,仍然是考主旨,借助关联词、主体、结构、或对策分析法找正确的标题,通过偏颇,片面,无关,过重,空泛的方法排除错误选项
  7. matlab神经网络训练结果误差很大,MATLAB搭建bp神经网络的误差特别大,但R2的值也大,求解帮我看看我的网络哪里出问题了...
  8. SERVQUAL模型(转载)
  9. asp.net904-中小型电商企业财务预算系统
  10. Bootstrap简述