java - 如何将附加纹理链接到着色器中。 LibGDX

标签 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();

我的 fragment 着色器是:

#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,这两个纹理都设置为我的“图像”。 希望大家帮忙,谢谢。

最佳答案

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

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

请注意,上述操作只需完成一次,该值将与着色器保持一致。

您正确地绑定(bind)了纹理,但最好在 batch.begin() 之前执行此操作,以防您将其他纹理绑定(bind)到应用程序中其他位置的该纹理单元。并且您必须确保在绑定(bind)后调用 Gdx.gl.glActiveTexture(GL_TEXTURE0);,因为 SpriteBatch 始终假定 Activity 纹理已保留为 0。

关于java - 如何将附加纹理链接到着色器中。 LibGDX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378006/

相关文章:

java - Arraylist.remove(index) 方法的效率?

java - 同质列表与异构列表

java - 如何使用扫描仪从文件中读取并以不同的顺序显示

java - 如何正确包含 cordova 插件的外部 jar 文件?

gcc - 由eglMakeCurrent触发的堆栈保护

ios - 游戏在 iOS 4.3 上运行良好,但在 iOS 5 上的 glDrawArrays 上崩溃

java - 为 JBoss 实现自定义 ServerAuthModule

android - Android-加载声音文件需要很长时间

java - 当我添加另一个元素时,如何修复我的 listView 复制相同的元素?

iPhone OpenGL ES - 如何选择