片段着色器旋转
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
,您应该会得到想要的结果。
我的片段着色器一直有一些问题。经过一些研究,似乎驱动程序清理了未使用的变量(那些对输出没有影响的变量?),这可能导致 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
,您应该会得到想要的结果。