片段着色器旋转

Fragment Shader Rotation

我的片段着色器一直有一些问题。经过一些研究,似乎驱动程序清理了未使用的变量(那些对输出没有影响的变量?),这可能导致 glSetUniform 和 glGetUniform 为 return -1。

我目前的问题是我试图将纹理旋转 180 度,但似乎我做错了什么,因为 uniform int "top" 似乎是垃圾收集的,而且不能成立。纹理根本没有旋转,但仍然渲染。统一"top"returns -1,这不应该发生。

这是我的相关代码:

渲染和着色器启用代码:(Shader.PIPE.enable() 调用 glUseProgram())

    Shader.PIPE.enable();
    Shader.PIPE.setUniformMat4f("vw_matrix", Matrix4f.translate(new Vector3f(xScroll * 0.03f, 0.0f, 0.0f)));    
    Pipe.getTexture().bind();
    Pipe.getMesh().bind();

    for (int i = 0; i < 5 * 2; i++) {
        Shader.PIPE.setUniformMat4f("ml_matrix", pipes[i].getModelMatrix());
        Shader.PIPE.setUniform1i("top",  i % 2 == 0 ? 1 : 0);
        Pipe.getMesh().draw();
    }
    Pipe.getMesh().unbind();
    Pipe.getTexture().unBind();

Pipe.frag:

#version 330 core

layout (location = 0) out vec4 color;

in DATA 
{
    vec2 tc;
} fs_in;

uniform sampler2D tex;
uniform int top;

void main() 
{   
    vec2 myTc = vec2(fs_in.tc.x, fs_in.tc.y);
    if (top == 1) {
        myTc.y = top - myTc.y;  
    }

    color = texture(tex, fs_in.tc);
    if (color.w  < 1.0)
        discard;
}

Pipe.vert:

#version 330 core

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 tc;

uniform mat4 pr_matrix;
uniform mat4 vw_matrix = mat4(1.0);
uniform mat4 ml_matrix = mat4(1.0);

out DATA
{
    vec2 tc;
} vs_out;

void main() 
{
    gl_Position = pr_matrix * vw_matrix * ml_matrix * position;
    vs_out.tc = tc;
}

编译器不仅可以完全消除未使用的变量,还可以消除对结果没有贡献的值。在您的代码中,此处使用 top

if (top == 1) {
    myTc.y = top - myTc.y;  
}

但是myTc后面在shader中没有用到。所以 myTc 的值对着色器的输出没有影响。这反过来意味着 top 的值无效。或者换句话说,着色器的结果是相同的,与 top.

的值无关

如果稍后在着色器中使用 myTc,这会以影响结果的方式发生变化。我实际上怀疑你打算这样做,并将它用作纹理坐标来对你的纹理进行采样。所以而不是:

color = texture(tex, fs_in.tc);

你应该使用:

color = texture(tex, myTc);

现在将使用top,您应该会得到想要的结果。