Glsl 具有法线和颜色的简单通过几何体着色器
我已经编写了一个非常简单的穿透几何体着色器。我的输入原语是points,输出原语也是points。我还想通过几何体着色器将颜色和法线从顶点着色器转发到片段着色器。着色器的编译和链接完美无瑕,但最终的颜色非常怪异。我认为这个转发有问题。有人能指出问题吗?以下是我的着色器: 顶点着色器:Glsl 具有法线和颜色的简单通过几何体着色器,glsl,geometry-shader,Glsl,Geometry Shader,我已经编写了一个非常简单的穿透几何体着色器。我的输入原语是points,输出原语也是points。我还想通过几何体着色器将颜色和法线从顶点着色器转发到片段着色器。着色器的编译和链接完美无瑕,但最终的颜色非常怪异。我认为这个转发有问题。有人能指出问题吗?以下是我的着色器: 顶点着色器: #version 330 compatibility struct vData { vec3 normal; vec4 color; }; out vData vertex; void mai
#version 330 compatibility
struct vData
{
vec3 normal;
vec4 color;
};
out vData vertex;
void main()
{
vertex.normal = gl_NormalMatrix * gl_Normal;
vertex.color = gl_Color;
gl_Position = ftransform();
}
几何体着色器:
#version 330
layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;
struct vData
{
vec3 normal;
vec4 color;
};
in vData vertices[];
out vData frag;
void main()
{
int i;
for(i = 0;i < gl_in.length();i++)
{
frag.normal = vertices[i].normal;
frag.color = vertices[i].color;
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
我知道了!输入/输出变量必须具有相同的名称,即几何体着色器中的
顶点[]
应为顶点[]
。就这样
我的改进和工作代码如下所示:
顶点着色器:
#version 330 compatibility
out vData
{
vec3 normal;
vec4 color;
}vertex;
void main()
{
vertex.normal = normalize(gl_NormalMatrix * gl_Normal);
vertex.color = gl_Color;
gl_Position = ftransform();
}
#version 330
layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;
in vData
{
vec3 normal;
vec4 color;
}vertices[];
out fData
{
vec3 normal;
vec4 color;
}frag;
void main()
{
int i;
for(i = 0;i < gl_in.length();i++)// gl_in.length() = 1 though!
{
frag.normal = vertices[i].normal;
frag.color = vertices[i].color;
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
#version 330 compatibility
in fData
{
vec3 normal;
vec4 color;
};
void main()
{
gl_FragColor = frag.color;
}
几何体着色器:
#version 330 compatibility
out vData
{
vec3 normal;
vec4 color;
}vertex;
void main()
{
vertex.normal = normalize(gl_NormalMatrix * gl_Normal);
vertex.color = gl_Color;
gl_Position = ftransform();
}
#version 330
layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;
in vData
{
vec3 normal;
vec4 color;
}vertices[];
out fData
{
vec3 normal;
vec4 color;
}frag;
void main()
{
int i;
for(i = 0;i < gl_in.length();i++)// gl_in.length() = 1 though!
{
frag.normal = vertices[i].normal;
frag.color = vertices[i].color;
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}
#version 330 compatibility
in fData
{
vec3 normal;
vec4 color;
};
void main()
{
gl_FragColor = frag.color;
}
快乐编码 停止在着色器阶段之间传递结构。是的,我知道这在技术上是标准允许的。但是没有人使用它,所以它没有经过IHV的良好测试。如果您需要输入和输出分组,谢谢您的回复!我应该遵守这一点!在fData{vec3 normal;vec4 color;}frag;或者只使用显式布局(位置)