LibGdx着色器(“着色器中没有名为'u_texture'的uniform”)

3
着色器编译成功,但渲染开始后程序崩溃了...我收到的错误信息是:"着色器中没有名为'u_texture'的统一变量"。以下是我的着色器代码:
#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
varying vec2 surfacePosition;


#define MAX_ITER 10
void main( void ) {

    vec2 p = surfacePosition*4.0;
    vec2 i = p;
    float c = 0.0;
    float inten = 1.0;

    for (int n = 0; n < MAX_ITER; n++) {
        float t = time * (1.0 - (1.0 / float(n+1)));
        i = p + vec2(
            cos(t - i.x) + sin(t + i.y), 
            sin(t - i.y) + cos(t + i.x)
        );
        c += 1.0/length(vec2(
            p.x / (sin(i.x+t)/inten),
            p.y / (cos(i.y+t)/inten)
            )
        );
    }
    c /= float(MAX_ITER);

    gl_FragColor = vec4(vec3(pow(c,1.5))*vec3(0.99, 0.97, 1.8), 1.0);
}

有人能帮助我吗?我不知道自己哪里出了错。顺便说一下,这是我在网上找到的着色器程序,所以我知道它可以工作,唯一的问题是如何让它与libgdx一起使用。


这个错误不是很明显吗?Libgdx使用统一变量u_texture来表示某些东西,而你的着色器必须有它。 - HolyBlackCat
我也想到了,但即使添加了它,错误仍然相同。 - user1176999
你确定错误是相同的吗?你是如何添加这个变量的? - HolyBlackCat
我刚刚在着色器程序中添加了uniform sampler2D u_texture;。 - user1176999
2个回答

8
libGDX的SpriteBatch默认假定你的着色器程序会有一个“u_texture”的统一变量。如果出现问题,只需在放入SpriteBatch之前添加“ShaderProgram.pedantic = false;”(Javadoc) 即可解决。更新:raveesh提到了着色器编译器会消失未使用的统一变量和属性,但是libGDX将OpenGL着色器包装在自定义的ShaderProgram中。

2

你不仅应该在你的着色器程序中添加统一的u_texture,还应该使用它,否则着色器编译器会将其优化掉。 但是看着你的着色器,似乎你根本不需要这个统一变量,所以检查你的程序是否有像shader.setUniformi("u_texture", 0);这样的内容,并将该行删除。然后就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接