[英]GLSL Geometry Shader problems
为此,我已经把头发拉了两天了。
首先..代码..所有。
//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 ..没关系。
当我检查int32返回的colorMap的gl_getuniformlocation时,其为-1。
当我调用gl_useprogram时,几乎就像该程序未运行。 它没有效果。我什至不能影响颜色,并且为colorMap返回-1使我认为片段着色器永远不会得到任何输入。 我尝试在顶点着色器中对顶点进行硬编码,这没有什么区别。
我不确定转换,但是我无法测试,因为我看不到任何东西。 就像我说的那样。 如果将顶点作为triangle_strip发送,则在屏幕上会看到triangle_strip。 感谢您抽出宝贵的时间阅读本文。
对不起所有代码,但也许有人可以发现我所缺少的东西。 另外,那里有很多不推荐使用的东西,但是在我的其他着色器中从来没有问题。
好的,我将尝试指出您所做的所有错误操作。 但是由于这段代码有很多错误,因此我可能不会全部了解。
#extension GL_EXT_geometry_shader4 : enable
GL 3.2中的核心“ 几何着色器”与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中的输入变量的最简单方法是:您是否必须在数组索引前添加前缀/后缀? 如果不这样做,则它不是输入变量。 所有“几何着色器”输入变量均已排列。
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
在您的顶点着色器中,通过gl_ModelViewMatrix
转换了输出位置。 它将位置从模型空间转换为相机/眼睛/视图空间(无论您要调用什么)。 因此,这些位置现在相对于相机而言。
gl_ModelViewProjectionMatrix
将位置从模型空间转换为投影空间。 如果您的位置在相机空间中(如先前所确定的那样),那么这种转换是没有意义的。
此处使用的正确矩阵将是gl_ProjectionMatrix
,它将从摄影机空间转换为投影空间。
这就是功能代码的样子。 使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.