首先需要有带法线的模型 learnOpenGL里面的
shader("vert","frag","geomery"); shader跟顶点着色器和片段着色器写法差不多
然后进入顶点着色器
out VS_OUT
{
vec3 normal;
}vs_out;
aNormal是读进来的layout
需要一个矩阵m来纠正法线mat3(transpose(inverse(view*model)));
vs_out.normal=projection*vec4(m*aNormal,0);
这个就是纠正的法线了
然后进入几何着色器
layout(triangles) in;
这个输入布局修饰符可以从顶点着色器接收下列任何一个图元值:
points
- :绘制GL_POINTS图元时(1)。
lines
- :绘制GL_LINES或GL_LINE_STRIP时(2)
lines_adjacency
- :GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY(4)
triangles
- :GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(3)
triangles_adjacency
- :GL_TRIANGLES_ADJACENCY或GL_TRIANGLE_STRIP_ADJACENCY
layout(line_strip,max_vertices=6) out;
输出布局修饰符也可以接受几个图元值:
points
line_strip
triangle_strip
同时希望我们设置一个它最大能够输出的顶点数量
in VS_OUT
{
vec3 normal;
}gs_in[];//数组
对应vertex
void G(int index)
{
//line_strip是绘制的图形
gl_Position=gl_in[index].gl_Position;//这是内置的gl_in
EmitVertex();这个就代表要绘制这个顶点
gl_Position=gl_in[index].gl_Position+vec4(gs_in[index].normal,0.0)*0.02;//*0.02不然会很长
EmitVertex();
EndPrimitive();//结束
}
void main()
{
G(0);G(1);G(2);
}
片段着色器 fragColor=vec4(1,0,0,1);随便写个颜色
就实现了一个把模型法向量显示出来的功能了。