首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PassThrough几何着色机不工作

PassThrough几何着色机不工作
EN

Stack Overflow用户
提问于 2015-12-06 00:43:30
回答 1查看 397关注 0票数 0

我目前使用的是FragmentShader和VertexShader,工作非常好。我的几何图形着色器无法工作。我对它完全陌生,下面是我尝试过的。

我使用的VBO,照明和纹理,以及一些几何,但它工作良好,然后使用GeometryShader。我唯一改变的是变量名,因为我必须在几何图形着色器中获得输入并给出输出。因此,我在这些变量的末尾附加了1,这些变量的名字将从几何图形着色器输出到片段着色器。

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

VertexShader

代码语言:javascript
复制
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;
}

这是我的FragemntShader

代码语言:javascript
复制
#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); 
 } 

这是我的GeometryShader

代码语言:javascript
复制
#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();
}

我只希望以前的东西是通过几何图形着色器从顶点着色器传递到碎片着色器,这样我以后就可以操纵着色器了。目前屏幕是黑色的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-06 01:03:58

您的核心问题是,您没有麻烦检查编译错误时,您构建您的几何着色。我知道这一点,因为我看到了一些语法错误。特别是:

代码语言:javascript
复制
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; 

几何着色输入总是聚合成数组。记住:几何着色器在https://www.opengl.org/wiki/Primitive上工作,它被定义为一个或多个顶点的集合。因此,每次GS调用都会获得一组每个顶点的输入值,其中一个对应于限定符中的每个顶点。

注意如何循环一个基元中的顶点数,并使用gl_in[i]获取基元中每个顶点的输入值。这就是你需要如何访问所有的几何着色输入。您需要将每个输出变量写入相应的输出变量,然后调用EmitVertex。都在那个圈子里。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34112683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档