Opengl 穿透几何体着色器不工作
我目前正在使用FragmentShader和VertexShader,效果非常好。我无法使几何体着色器正常工作。我对它完全陌生,下面是我尝试过的 我正在使用VBO、照明和纹理以及一些几何体,但在使用GeometryShader之前效果很好。我唯一更改的是变量名,因为我必须在几何体着色器中获取输入并给出输出。因此,我在变量名的末尾添加了1,这些变量名将从几何体着色器输出到片段着色器 此外,我还添加了以#开头的标题,这在以前是不存在的。我正在使用GL_三角形来绘制 顶点着色器Opengl 穿透几何体着色器不工作,opengl,glsl,geometry-shader,Opengl,Glsl,Geometry Shader,我目前正在使用FragmentShader和VertexShader,效果非常好。我无法使几何体着色器正常工作。我对它完全陌生,下面是我尝试过的 我正在使用VBO、照明和纹理以及一些几何体,但在使用GeometryShader之前效果很好。我唯一更改的是变量名,因为我必须在几何体着色器中获取输入并给出输出。因此,我在变量名的末尾添加了1,这些变量名将从几何体着色器输出到片段着色器 此外,我还添加了以#开头的标题,这在以前是不存在的。我正在使用GL_三角形来绘制 顶点着色器 in vec4 pos
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;
}
这是我的碎片
#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);
}
#版本330兼容性
均匀的纹理;
在vec4-pcolor中;
vec3n1;
在vec3 L1中;
在vec3 R1中;
vec3v1;
均匀的mat4-local2clip;
均匀mat4局部2眼;
一致mat4正规矩阵;
统一mat4 world2eye;
均匀的vec4光照环境;
均匀vec4光漫射;
均匀vec4光镜;
均匀vec4灯位置;
均匀的vec4材料环境;
均匀vec4材料扩散;
均匀vec4材料镜面反射;
均匀的浮垫;
均匀取样器2d-Tex1;
在vec2中,FtexCoord1;
void main(){
vec4环境=光照环境*材料环境;
浮动NdotL;
if(dot(N1,L1)问题的核心是,在构建几何体着色器时,您没有检查编译错误。我知道这一点,因为我看到它有几个语法错误。特别是:
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;
始终聚合到数组中。请记住:几何体着色器在上操作,它被定义为一个或多个顶点的集合。因此,每次GS调用都会获得一组逐顶点输入值,其中每个顶点对应一个
请注意如何循环基本体中的顶点数,并在[i]中使用gl\u
获取基本体中每个顶点的输入值。这就是您需要访问所有几何体着色器输入的方式。您需要将每个输入写入其相应的输出变量,然后调用EmitVertex
。所有这些都在该循环中。问题的核心是,您在执行你构建了你的几何体着色器。我知道这一点,因为我看到它有几个语法错误。特别是:
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;
始终聚合到数组中。请记住:几何体着色器在上操作,它被定义为一个或多个顶点的集合。因此,每次GS调用都会获得一组逐顶点输入值,其中每个顶点对应一个
请注意如何循环基本体中的顶点数,并在[i]中使用gl\u
获取基本体中每个顶点的输入值。这就是您需要访问所有几何体着色器输入的方式。您需要将每个输入写入其相应的输出变量,然后调用EmitVertex
。所有这些都在该循环中。我做了一些更改,它可以工作,但我添加了图片,这与我所使用的有所不同巴瓦亚罗拉:顺便说一句,你应该读一读。谢谢你让我知道,我没有意识到这一点。我会跟进新的。如果你能在这方面帮助我,我会很高兴的。:)我做了一些修改,效果很好,但我添加了图片,我以前得到的和现在得到的有所不同。@BhavyaArora:顺便说一句,你应该读一下。谢谢你让我知道,我没有意识到这一点。我会跟进新的。如果你能在这方面帮助我,我会很高兴的。:)