Vulkan Shader——几何着色器之法线可视化

几何着色器

我们大部分情况下仅使用顶点着色器(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

最新文章