我真的被这个问题困扰。
我需要将纹理链接到着色器以像置换贴图一样使用它。
这是我的代码:
//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
,两种纹理都设置为我的“图像”。希望任何人都能帮助,谢谢。
最佳答案
若要设置着色器制服,必须首先绑定着色器:
shaderProgram.begin();
shaderProgram.setUniformi("u_texture2",1);
shaderProgram.end();
请注意,上面仅需执行一次,该值将保留在着色器中。
您可以正确地绑定纹理,但是最好在
batch.begin()
之前执行此操作,以防将其他纹理绑定到应用程序中其他位置的纹理单元。并且必须确保在绑定后调用Gdx.gl.glActiveTexture(GL_TEXTURE0);
,因为SpriteBatch始终假定活动纹理保留为0。