【问题标题】:PassThrough Geometry Shader Not Working直通几何着色器不起作用
【发布时间】:2015-12-06 00:43:30
【问题描述】:

我目前正在使用 FragmentShader 和 VertexShader,并且工作得非常好。我无法让我的几何着色器工作。我对它完全陌生,以下是我尝试过的。

我正在使用 VBO、照明和纹理以及一些几何图形,但在使用 GeometryShader 之前它可以正常工作。我唯一改变的是变量名,因为我必须在几何着色器中获取输入并给出输出。所以我在那些将从几何着色器输出到片段着色器的变量名称的末尾附加了 1。

我还添加了以 # 开头的标题,这些标题之前不存在。我正在使用 GL_TRIANGLES 进行绘制。

顶点着色器

in vec4 position; 
in vec4 color1;
in vec4 normal; 
in vec2 texCoord; 

uniform sampler2D Tex1; 

uniform int use_texture;

out vec4 pcolor;

out vec3 N;
out vec3 L;
out vec3 R;
out vec3 V;


uniform mat4 local2clip;
uniform mat4 local2eye;
uniform mat4 normal_matrix;
uniform mat4 world2eye; 

uniform vec4 light_ambient;
uniform vec4 light_diffuse;
uniform vec4 light_specular;
uniform vec4 light_pos;
#version 330 compatibility

uniform vec4 mat_ambient;
uniform vec4 mat_diffuse;
uniform vec4 mat_specular;
uniform float mat_shine; 

//varying vec3 v_normal;  // vertex normal 
out vec4 v_color;   // vertex color 
out vec4 pos_in_eye;  //vertex position in eye space 
out vec2 FtexCoord; 

void main(){

       gl_Position = local2clip * position;

       N =     normalize(vec3(normal_matrix * normal));    //v_normal
       vec4 Lpos =  world2eye * light_pos;                  //light pos. in eye
       vec4 Vpos =  local2eye * position;                   //pos_in_eye
       L = normalize(vec3(Lpos - Vpos));                    //light_vector

       R = normalize(reflect(-L, N)); 
       V = normalize(vec3(-Vpos));                          //eye vector

       vec3 halfv = normalize(L+V);
       FtexCoord = texCoord; 

       //pcolor = color1;
}

这是我的 FragmentShader

#version 330 compatibility

uniform int use_texture; 

in vec4 pcolor; 

in vec3 N1;
in vec3 L1;
in vec3 R1;
in vec3 V1;


uniform mat4 local2clip;
uniform mat4 local2eye;
uniform mat4 normal_matrix;
uniform mat4 world2eye; 

uniform vec4 light_ambient;
uniform vec4 light_diffuse;
uniform vec4 light_specular;
uniform vec4 light_pos;

uniform vec4 mat_ambient;
uniform vec4 mat_diffuse;
uniform vec4 mat_specular;
uniform float mat_shine;

uniform sampler2D Tex1; 
in vec2 FtexCoord1; 

void main() { 

       vec4 ambient = light_ambient * mat_ambient;
       float NdotL; 
       if (dot(N1,L1) <0.0) NdotL = 0.0; 
       else NdotL = dot(N1, L1); 

       vec4 diffuse = light_diffuse * mat_diffuse * NdotL;

       float RdotV; 
       RdotV = dot(R1, V1); 

       if (NdotL == 0.0) RdotV = 0.0; 
       if (RdotV <0.0) RdotV = 0.0; 

       vec4 specular = light_specular * mat_specular * pow(RdotV,mat_shine);   

       vec4 texcolor;


       if( use_texture == 1 ) {
          texcolor = texture2D(Tex1, FtexCoord1); 
          gl_FragColor = texcolor; 
       }
       else
          gl_FragColor = (diffuse + ambient + specular); 
 } 

这是我的几何着色器

#version 330

layout (triangles) in;
layout (triangles) out;
layout (max_vertices = 3) out;

out vec3 N1;
out vec3 L1;
out vec3 R1;
out vec3 V1;

in vec3 N;
in vec3 L;
in vec3 R;
in vec3 V;

uniform mat4 local2clip;
uniform mat4 local2eye;
uniform mat4 normal_matrix;
uniform mat4 world2eye; 

uniform vec4 light_ambient;
uniform vec4 light_diffuse;
uniform vec4 light_specular;
uniform vec4 light_pos;

uniform vec4 mat_ambient;
uniform vec4 mat_diffuse;
uniform vec4 mat_specular;
uniform float mat_shine; 

//varying vec3 v_normal;  // vertex normal 
out vec4 v_color1;  // vertex color 
out vec4 pos_in_eye1;  //vertex position in eye space 
out vec2 FtexCoord1; 

in vec4 v_color;    // vertex color 
in vec4 pos_in_eye;  //vertex position in eye space 
in vec2 FtexCoord; 

void main(void)
{
    int i;
        N1=N;
        L1=L;
        R1=R;
        V1=R;

        FtexCoord1=FtexCoord;
        v_color1=v_color;
        pos_in_eye1=pos_in_eye;



    for (i = 0; i < gl_in.length(); i++)
    {


        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

我只是希望之前存在的内容通过几何着色器从顶点着色器传递到片段着色器,以便以后可以操作着色器。目前屏幕只是黑屏

【问题讨论】:

    标签: opengl glsl geometry-shader


    【解决方案1】:

    您的问题的核心是您在构建几何着色器时没有费心检查编译错误。我知道这是因为我看到了几个语法错误。特别是:

    in vec3 N;
    in vec3 L;
    in vec3 R;
    in vec3 V;
    
    in vec4 v_color;    // vertex color 
    in vec4 pos_in_eye;  //vertex position in eye space 
    in vec2 FtexCoord; 
    

    Geometry Shader inputs总是聚合成数组。请记住:几何着色器在 primitives 上运行,它们被定义为一个或多个顶点的集合。因此,每个 GS 调用都会获得一组每个顶点的输入值,每个顶点对应一个 primitive type defined by your layout in qualifier

    请注意您如何遍历图元中的顶点数并使用gl_in[i] 获取图元中每个顶点的输入值。这就是您需要访问所有几何着色器输入的方式。而你需要将每一个写入其对应的输出变量,然后调用EmitVertex。都在那个循环中。

    【讨论】:

    • 我做了一些改变,它可以工作,但是我添加了图片,我以前得到的和现在得到的有所不同。
    • @BhavyaArora:顺便说一句,你应该阅读Stack Overflow policy on follow-up questions
    • 感谢您告诉我,我不知道这一点。我会跟进新的。如果你能在这方面帮助我,我会很高兴。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多