如何将其他纹理链接到着色器。 LibGDX

时间:2016-05-22 18:27:51

标签: java android opengl-es libgdx

我真的遇到了这个问题。 我需要将纹理链接到着色器以像使用置换贴图一样使用它。 这是我的代码:

//create method
    displacement = new Texture(Gdx.files.internal("displacementMap.png"));
    shaderProgram = new ShaderProgram(Gdx.files.internal("vertexShader.vert"),Gdx.files.internal("fragmentShader.frag"));

    shaderProgram.pedantic = false;
    batch.setShader(shaderProgram);

    shaderProgram.setUniformi("u_texture2",1);
    Gdx.gl.glActiveTexture(GL_TEXTURE1);
    displacement.bind();
    Gdx.gl.glActiveTexture(GL_TEXTURE0);

//render method
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    image.draw(batch);
    batch.end();

我的片段着色器是:

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform sampler2D u_texture2;
void main(){

vec4 buf = texture2D(u_texture, v_texCoords);
gl_FragColor = buf;

}

所以我意识到通过将u_texture更改为u_texture2,两个纹理都设置为我的“图片”。 希望有人能提供帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

要设置着色器制服,必须首先绑定着色器:

shaderProgram.begin();
shaderProgram.setUniformi("u_texture2",1);
shaderProgram.end();

请注意,上面只需执行一次,值将与着色器一起使用。

你正确地绑定了纹理,但是如果你将一些其他纹理绑定到应用程序中其他地方的纹理单元,那么在batch.begin()之前做这个是个好主意。并且您必须确保在绑定后调用Gdx.gl.glActiveTexture(GL_TEXTURE0);,因为SpriteBatch始终假定活动纹理保留为0。