几何着色器(二) 表面法线可视化

从之前的介绍,我们已经了解了几何着色器的基本知识,现在介绍一下如何用几何着色器实现表面法线的可视化

如果是第一次了解几何着色器,可以先了解基本知识:几何着色器(一)

效果图:



首先我们先了解一下绘制流程

    1.激活顶点着色器和片元着色器

    2.正常绘制模型

    3.激活顶点、几何、片元着色器

    4.绘制法线

    也就是说我们要绘制两次

着色器代码:


顶点着色器:

attribute vec3 a_Vertex;
attribute vec2 a_TexCoord;
uniform mat4 MVP_matrix;
varying vec2 v_TexCoord0;
varying vec3 v_position;
varying vec4 color;
out Vertex
{
     vec2 v_TexCoord0;
     vec3 v_position;
     vec4 color;
} vertex;
 
 
void main(void)
{
    gl_Position = MVP_matrix *vec4(a_Vertex,1.0);
    v_position = a_Vertex;
    v_TexCoord0 = a_TexCoord;
    vertex.v_TexCoord0 = a_TexCoord;
    vertex.v_position = a_Vertex;
    vertex.color = vec4(0,0,0,1);
    color = vec4(0,0,0,1);
}
 
 

几何着色器:

这里我是在几何着色器上再次计算了法线,但是如果模型已经计算了法线,那么直接传入然后使用就可以了。

#version 330 core
layout(triangles) in ;
layout(line_strip, max_vertices = 6) out; //输出的图元为直线,最多输出六个点
 
 
out vec2 v_TexCoord0;
out vec3 v_position;
out vec4 color;
 
 
in Vertex  //从顶点着色器获得的参数,注意这里应为一个数组
{
   vec2 v_TexCoord0;
   vec3 v_position;
   vec4 color;
} vertex[];
 
 
vec3 getNormal(vec4 pos0, vec4 pos1, vec4 pos2)
{
  vec3 a = vec3(pos0) - vec3(pos1);
  vec3 b = vec3(pos2) - vec3(pos1);
  return normalize(cross(a, b));
}
 
 
void makeDo()
{
    int i =0;
        vec3 normal = getNormal(gl_in[0].gl_Position,gl_in[1].gl_Position,gl_in[2].gl_Position);
 
 
        vec3 c = vec3(gl_in[0].gl_Position);
        for( i =0; i< gl_in.length(); i++)
        {
          gl_Position =  gl_in[i].gl_Position;
          v_position = vertex[i].v_position;
          v_TexCoord0 = vertex[i].v_TexCoord0;
          color = vec4(1,0,0,1);
          EmitVertex();
 
 
          gl_Position = gl_in[i].gl_Position+vec4(normal,1)*2;
          v_position = vertex[i].v_position;
          v_TexCoord0 = vertex[i].v_TexCoord0;
          color = vec4(1,0,0,1);
          EmitVertex();
         EndPrimitive();
        }
 
 
 
 
void main()
{
 
 
   makeDo();
}
 
 

片元着色器:

uniform sampler2D u_Texture0;
in vec2 v_TexCoord0;
in vec3 v_position;
in vec4 color;
void main(void)
{
    if(color ==vec4(0,0,0,1))
    gl_FragColor = texture2D(u_Texture0, v_TexCoord0)*0.9;
    else
         gl_FragColor = vec4(0,1,0,1);
 
 
 
 
 
 
}
 
 



猜你喜欢

转载自blog.csdn.net/qq_31804159/article/details/80372596