2016-08-13 95 views
0

我想将纹理传递给我的着色器,但是当设置为我的纹理的sampler2D制服具有与持有OpenGL提供的当前纹理的u_sampler2D相同的内容时。LibGDX将纹理传递给着色器的问题

这里是我设置统一(这是我的SpriteBatch的呼唤super.begin()之前开始方法):

texture.bind(); 
this.getShader().begin(); 
this.getShader().setUniformi("u_LightMap",0); 
this.getShader().setUniformf("u_camOffset", new Vector3(inputMethod.getCameraOffsetX(), inputMethod.getCameraOffsetY(), inputMethod.getZoom())); 
this.getShader().end(); 

这是我的测试着色器:

precision mediump float; 

varying vec4 v_color; 
varying vec2 v_texCoord0; 

uniform vec4 gl_FragCoord; 
uniform sampler2D u_sampler2D; 
uniform sampler2D u_LightMap; 
uniform vec3 u_cam; 
uniform vec2 resolution; 
void main() { 
    vec4 lightColor = texture2D(u_LightMap, gl_FragCoord); 
    gl_FragColor = lightColor; 
} 

在哪里问题? 〜BeefEX

+0

你从未在SpriteBatch中设置着色器。但如果你这样做,那么你会在纹理单元上发生碰撞,所以最好使用例如纹理单元1.但是,这只是猜测,没有看到实际的代码,这是不可能的。 – Xoppa

+0

是的,我正在设置着色器,在主类的启动方法。而对于纹理编号,我尝试了许多数字,从OpenGL封装中隐藏常量。 – BeefEX

+0

你没有说出了什么问题。黑色纹理?你确定着色器编译?如果ShaderProgram.pedantic为true,则由于未使用的制服,现在的着色器可能无法编译。 – Tenfour04

回答

0

看看你在super.begin()中调用的源代码。它将精灵的纹理绑定到与刚绑定其他纹理相同的单元,覆盖它。将您的自定义纹理绑定到第一个单元,然后在调用super之前将GL活动纹理单元更改回0。

+0

好吧,这段代码来自LibGDX wiki,但我会尝试一下。 – BeefEX