几何着色器
我们大部分情况下仅使用顶点着色器(vertex shader)和片元着色器(fragment shader),而实际上vulkan还提供了一个可选的几何着色器(geometry shader)。几何着色器位于顶点和片元着色器之间,如果没有使用时,则顶点着色器输出到片元着色器,在使用几何着色器后,顶点着色器输出组成一个基础图元的顶点信息到几何着色器,经过几何着色器处理后,再输出到片元着色器。几何着色器能够产生0个以上的基础图元(primitive),它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。
法线可视化
首先简述一下我们需要实现的简单效果,在原始模型的基础上我们来实现法线可视化:
1.原始加载模型代码不变;
2.新增一个管线来绘制法线;
3.shader部分新增一个顶点、几何、片元着色器来处理法线;
创建管线等基础部分就不在累述,如果想看具体实现,见最后源码。
那么我来主要说一下新增的shader部分,首先来看片元着色器:
#version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable layout (location = 0) in vec3 inColor; layout (location = 0) out vec4 outFragColor; void main(void){ outFragColor = vec4(inColor, 1.0); }
最简单的片元着色器,无需多说。接下来我们看的是顶点着色器,显然 也无需多说,依旧很简单:
#version 450
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable layout (location = 0) in vec3 inPos; layout (location = 1) in vec3 inNormal; layout (location = 0) out vec3 outNormal; out gl_PerVertex{ vec4 gl_Position; }; void main(void){ outNormal = inNormal; gl_Position = vec4(inPos.xyz, 1.0); }
那么接下来中点来了,我们在以上两个阶段之间添加一个集合着色器normaldebug.geom:
#version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable layout (triangles) in; layout (line_strip, max_vertices = 6) out; layout (binding = 1) uniform UBO { mat4 projection; mat4 model; } ubo; layout (location = 0) in vec3 inNormal[]; layout (location = 0) out vec3 outColor; void main(void) { float normalLength = 10; for(int i=0; i<gl_in.length(); i++) { vec3 pos = gl_in[i].gl_Position.xyz; vec3 normal = inNormal[i].xyz; gl_Position = ubo.projection * (ubo.model * vec4(pos, 1.0)); outColor = vec3(0.0, 1.0, 0.0); EmitVertex(); gl_Position = ubo.projection * (ubo.model * vec4(pos + normal * normalLength, 1.0)); outColor = vec3(0.0, 1.0, 1.0); EmitVertex(); EndPrimitive(); } }
layout (*) in;输入可以有如下:
- points:绘制GL_POINTS图元时
layout (*) out输出如下:
- points 输出的图元是点
- line_strip 输出的图元是线
- triangle_strip 输出的图元是三角形
- max_vertices 代表输出的最大顶点数量,超过这个数量,shader将不再绘制多出的顶点。
注:EmitVertex表示输出一个顶点,而EndPrimitive表示结束一个图元的输出,这是一对命令。只有几何着色器才有的命令。不明白的可以Google其用法
上述shader主要作用是在法线起点和延法线延长normalLength出新增两个点,并对其设置颜色。
运行,可看到如下效果:
此外几何着色器还有更多效果,有时间我们再来试一下爆炸或者腐蚀消散等效果吧。
附:main源码
版权声明:本文为CSDN博主 沉默的舞台剧 原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_35312463/article/details/104889100