GLSL 几何着色器问题
GLSL Geometry Shader problems
我已经为此苦恼了 2 天。
首先..代码..全部。
//Leaf Vertex Shader
#version 330 compatibility
out vec4 VertexColor;
void main(void)
{
gl_Position = gl_ModelViewMatrix *gl_Vertex;
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
gl_TexCoord[1].st = gl_MultiTexCoord1.st;
gl_TexCoord[2].st = gl_MultiTexCoord2.st;
gl_TexCoord[3].st = gl_MultiTexCoord3.st;
gl_TexCoord[4].st = gl_MultiTexCoord4.st; // this is out size in x.y
VertexColor = gl_Color;
}
地理着色器
#version 330 compatibility
#extension GL_EXT_geometry_shader4 : enable
//uniform float uNormalsLength;
out vec2 texCoord;
out vec4 color;
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
void main(void)
{
vec4 vVertex = gl_in[0].gl_Position;
vec2 uvs[4];
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
float vx[4];
vx[0] = -1.0;
vx[1] = -1.0;
vx[2] = 1.0;
vx[3] = 1.0;
float vy[4];
vy[0]= -1.0;
vy[1]= 1.0;
vy[2]= 1.0;
vy[3]= -1.0;
int indi[4];
indi[0] = 0;
indi[1] = 3;
indi[2] = 1;
indi[3] = 2;
texCoord = uvs[0];
vec4 oVertex = gl_PositionIn[0];
color = vec4(0.5, 0.5, 0.5, 1.0);
for(int i = 0; i < 4; ++i)
{
oVertex.xyz = vVertex.xyz;
color = vec4(0.0, 0.0, 0.5, 1.0);
oVertex.x += (vx[ indi[i] ] * scale.x);
oVertex.y += (vx[ indi[i] ] * scale.y);
texCoord.xy = uvs[ indi[i] ].xy;
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
EmitVertex();
}
EndPrimitive();
}
片段着色器
// leaf fragment shader
#version 330 compatibility
uniform sampler2D colorMap;
in vec2 texCoord;
in vec4 color;
out vec4 FragColor;
void main (void)
{
vec2 uv = texCoord.xy;
uv.y *= -1.0;
vec4 t = texture2D(colorMap,uv);
FragColor = t;
FragColor.rgb += color.rgb;
}
当我发送这个分数时,我除了得到一个分数外什么也没有得到。
我试过发送 triangle_stips.. 没有区别。
当我检查 colorMap 返回的 int32 gl_getuniformlocation 时,它是 -1。
当我调用 gl_useprogram 时,这个程序几乎没有 运行。它没有效果..我什至不能影响颜色和..为colorMap返回-1让我觉得片段着色器永远不会得到任何输入。
我已经尝试在顶点着色器中对顶点进行硬编码,但没有任何区别。
我不确定转换,但我无法测试它,因为除了一个点,我什么都看不到。就像我说的.. 就像它从未被加载过一样。如果我将顶点作为 triangle_strip 发送,我会在屏幕上看到 triangle_strip。
感谢任何花时间阅读本文的人。
抱歉所有代码,但也许有人能发现我遗漏的东西。
另外.. 里面有很多不赞成使用的东西,但在我的其他着色器中从来都不是问题。
好的,我会尽力指出你所做的所有错误事情。但是由于这段代码有 太多 错误,我可能无法全部理解。
#extension GL_EXT_geometry_shader4 : enable
GL 3.2 中的核心 Geometry Shaders 与 EXT_geometry_shader4 功能之间的交互没有明确定义。因此,这条线究竟会做什么是未知的。
应删除此行以及与其相关的任何代码。例如,输入变量gl_PositionIn
是由EXT_geometry_shader4定义的,但不是核心GS。奇怪的是,您确实使用了该值,但出于某种原因,您立即在循环的第一步中覆盖了它。
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
无论你把它放在哪个着色器阶段,gl_TexCoord
总是指的是那个阶段的输出。 从不 输入。因此,您正在复制您从未写入的着色器阶段输出变量的值。
正确的输入变量名应该是gl_in[0].gl_TexCoord[x]
。
检查您是否正在读取 GS 中的输入变量的最简单方法是:您是否必须 prefix/suffix 使用数组索引?如果不这样做,那么它不是输入变量。所有几何着色器输入变量都已排列。
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
在您的顶点着色器中,您通过 gl_ModelViewMatrix
变换了输出位置。它将位置从模型 space 转换为 camera/eye/view space (随便你怎么称呼它)。所以这些位置现在是相对于相机的。
gl_ModelViewProjectionMatrix
将位置从 模型 space 转换为投影 space。如果你的位置在相机 space 中(如前所述,它们是),那么这种转换是荒谬的。
此处使用的正确矩阵是 gl_ProjectionMatrix
,它从相机 space 转换为投影 space。
这就是功能代码的样子。使用 OpenGL 3.3 核心配置文件的代码。
顶点着色器:
#version 330 core
in vec4 position;
in vec4 color;
in vec2 texCoords[4]; //Yes, that's perfectly legal.
in vec2 scaleFactor;
out VS
{
out vec4 color;
out vec2 texCoords[4]; //Yes, this is legal too.
out vec2 scaleFactor;
} dest;
//The transformation from model space to camera space.
uniform mat4 modelToCamera;
void main(void)
{
gl_Position = modelToCamera * position;
dest.color = color;
for(int i = 0; i < texCoord.length(); ++i)
dest.texCoord[i] = texCoord[i];
dest.scaleFactor = scaleFactor;
}
几何着色器:
#version 330 core
layout(points) in;
layout(triangle_strip, points) out;
in VS
{
vec4 color;
vec2 texCoords[4]; //Still legal.
vec2 scaleFactor;
} source[]; //One for each input vertex, but since we're using points, it's just one.
out FS
{
vec4 color;
vec2 texCoord;
} dest;
const vec2 offsets[4] = vec2[4](
vec2(-1.0, -1.0),
vec2(-1.0, 1.0),
vec2( 1.0, 1.0),
vec2( 1.0, -1.0));
//The transformation from camera to projection.
uniform mat4 ProjectionTM;
void main(void)
{
for(int i = 0; i < offsets.length(); ++i)
{
dest.color = source[0].color;
dest.texCoord = source[0].texCoord[i];
vec2 scale = offsets[i] * source[0].scaleFactor;
vec4 pos = gl_in[0].gl_Position;
pos.xy += scale;
gl_Position = ProjectionTM * pos;
EmitVertex();
}
EndPrimitive();
}
片段着色器:
#version 330 core
in FS
{
vec4 color;
vec2 texCoord;
};
layout(location = 0) out vec4 FragColor;
uniform sampler2D colorMap;
void main (void)
{
vec4 t = texture2D(colorMap, texCoord.xy * vec2(1.0, -1.0));
FragColor = t;
FragColor.rgb += color.rgb;
}
我已经为此苦恼了 2 天。
首先..代码..全部。
//Leaf Vertex Shader
#version 330 compatibility
out vec4 VertexColor;
void main(void)
{
gl_Position = gl_ModelViewMatrix *gl_Vertex;
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
gl_TexCoord[1].st = gl_MultiTexCoord1.st;
gl_TexCoord[2].st = gl_MultiTexCoord2.st;
gl_TexCoord[3].st = gl_MultiTexCoord3.st;
gl_TexCoord[4].st = gl_MultiTexCoord4.st; // this is out size in x.y
VertexColor = gl_Color;
}
地理着色器
#version 330 compatibility
#extension GL_EXT_geometry_shader4 : enable
//uniform float uNormalsLength;
out vec2 texCoord;
out vec4 color;
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
void main(void)
{
vec4 vVertex = gl_in[0].gl_Position;
vec2 uvs[4];
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
float vx[4];
vx[0] = -1.0;
vx[1] = -1.0;
vx[2] = 1.0;
vx[3] = 1.0;
float vy[4];
vy[0]= -1.0;
vy[1]= 1.0;
vy[2]= 1.0;
vy[3]= -1.0;
int indi[4];
indi[0] = 0;
indi[1] = 3;
indi[2] = 1;
indi[3] = 2;
texCoord = uvs[0];
vec4 oVertex = gl_PositionIn[0];
color = vec4(0.5, 0.5, 0.5, 1.0);
for(int i = 0; i < 4; ++i)
{
oVertex.xyz = vVertex.xyz;
color = vec4(0.0, 0.0, 0.5, 1.0);
oVertex.x += (vx[ indi[i] ] * scale.x);
oVertex.y += (vx[ indi[i] ] * scale.y);
texCoord.xy = uvs[ indi[i] ].xy;
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
EmitVertex();
}
EndPrimitive();
}
片段着色器
// leaf fragment shader
#version 330 compatibility
uniform sampler2D colorMap;
in vec2 texCoord;
in vec4 color;
out vec4 FragColor;
void main (void)
{
vec2 uv = texCoord.xy;
uv.y *= -1.0;
vec4 t = texture2D(colorMap,uv);
FragColor = t;
FragColor.rgb += color.rgb;
}
当我发送这个分数时,我除了得到一个分数外什么也没有得到。 我试过发送 triangle_stips.. 没有区别。
当我检查 colorMap 返回的 int32 gl_getuniformlocation 时,它是 -1。
当我调用 gl_useprogram 时,这个程序几乎没有 运行。它没有效果..我什至不能影响颜色和..为colorMap返回-1让我觉得片段着色器永远不会得到任何输入。 我已经尝试在顶点着色器中对顶点进行硬编码,但没有任何区别。
我不确定转换,但我无法测试它,因为除了一个点,我什么都看不到。就像我说的.. 就像它从未被加载过一样。如果我将顶点作为 triangle_strip 发送,我会在屏幕上看到 triangle_strip。 感谢任何花时间阅读本文的人。
抱歉所有代码,但也许有人能发现我遗漏的东西。 另外.. 里面有很多不赞成使用的东西,但在我的其他着色器中从来都不是问题。
好的,我会尽力指出你所做的所有错误事情。但是由于这段代码有 太多 错误,我可能无法全部理解。
#extension GL_EXT_geometry_shader4 : enable
GL 3.2 中的核心 Geometry Shaders 与 EXT_geometry_shader4 功能之间的交互没有明确定义。因此,这条线究竟会做什么是未知的。
应删除此行以及与其相关的任何代码。例如,输入变量gl_PositionIn
是由EXT_geometry_shader4定义的,但不是核心GS。奇怪的是,您确实使用了该值,但出于某种原因,您立即在循环的第一步中覆盖了它。
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
无论你把它放在哪个着色器阶段,gl_TexCoord
总是指的是那个阶段的输出。 从不 输入。因此,您正在复制您从未写入的着色器阶段输出变量的值。
正确的输入变量名应该是gl_in[0].gl_TexCoord[x]
。
检查您是否正在读取 GS 中的输入变量的最简单方法是:您是否必须 prefix/suffix 使用数组索引?如果不这样做,那么它不是输入变量。所有几何着色器输入变量都已排列。
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
在您的顶点着色器中,您通过 gl_ModelViewMatrix
变换了输出位置。它将位置从模型 space 转换为 camera/eye/view space (随便你怎么称呼它)。所以这些位置现在是相对于相机的。
gl_ModelViewProjectionMatrix
将位置从 模型 space 转换为投影 space。如果你的位置在相机 space 中(如前所述,它们是),那么这种转换是荒谬的。
此处使用的正确矩阵是 gl_ProjectionMatrix
,它从相机 space 转换为投影 space。
这就是功能代码的样子。使用 OpenGL 3.3 核心配置文件的代码。
顶点着色器:
#version 330 core
in vec4 position;
in vec4 color;
in vec2 texCoords[4]; //Yes, that's perfectly legal.
in vec2 scaleFactor;
out VS
{
out vec4 color;
out vec2 texCoords[4]; //Yes, this is legal too.
out vec2 scaleFactor;
} dest;
//The transformation from model space to camera space.
uniform mat4 modelToCamera;
void main(void)
{
gl_Position = modelToCamera * position;
dest.color = color;
for(int i = 0; i < texCoord.length(); ++i)
dest.texCoord[i] = texCoord[i];
dest.scaleFactor = scaleFactor;
}
几何着色器:
#version 330 core
layout(points) in;
layout(triangle_strip, points) out;
in VS
{
vec4 color;
vec2 texCoords[4]; //Still legal.
vec2 scaleFactor;
} source[]; //One for each input vertex, but since we're using points, it's just one.
out FS
{
vec4 color;
vec2 texCoord;
} dest;
const vec2 offsets[4] = vec2[4](
vec2(-1.0, -1.0),
vec2(-1.0, 1.0),
vec2( 1.0, 1.0),
vec2( 1.0, -1.0));
//The transformation from camera to projection.
uniform mat4 ProjectionTM;
void main(void)
{
for(int i = 0; i < offsets.length(); ++i)
{
dest.color = source[0].color;
dest.texCoord = source[0].texCoord[i];
vec2 scale = offsets[i] * source[0].scaleFactor;
vec4 pos = gl_in[0].gl_Position;
pos.xy += scale;
gl_Position = ProjectionTM * pos;
EmitVertex();
}
EndPrimitive();
}
片段着色器:
#version 330 core
in FS
{
vec4 color;
vec2 texCoord;
};
layout(location = 0) out vec4 FragColor;
uniform sampler2D colorMap;
void main (void)
{
vec4 t = texture2D(colorMap, texCoord.xy * vec2(1.0, -1.0));
FragColor = t;
FragColor.rgb += color.rgb;
}