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;
}