android - 将多个纹理传递给 LibGDX 中的着色器

标签 android libgdx opengl-es-2.0 fragment-shader pixel-shader

我需要将 2 个(或更多)纹理传递给一个着色器。此外,我必须在渲染方法中绑定(bind)纹理,因为我使用 FrameBuffer 并尝试动态绑定(bind)纹理。所以,我的代码如下:

@Override
public void show () {
      fbo = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

      shader = new ShaderProgram(Gdx.files.internal("shaders/vertex.glsl"), Gdx.files.internal("shaders/test_fragment.glsl"));
    ...
}

@Override
public void render(float delta) {

    fbo.begin();        
    Gdx.graphics.getGL20().glClearColor( 0.0f, 0.0f, 0.0f, 1f );
    Gdx.graphics.getGL20().glClear( GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );      

    cam.update();

    spriteBatch.setProjectionMatrix(cam.combined);

    spriteBatch.begin();        
    spriteBatch.draw(someImage, 0, 0, width, height);                   
    spriteBatch.end();
    fbo.end();

    Texture texture = fbo.getColorBufferTexture();

    time+=Gdx.graphics.getDeltaTime();      

    shader.begin();

     shader.setUniformMatrix(u_wview, cam.projection);
     Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
     texture.bind(0);

     shader.setUniformi("u_texture", 0); //passing first texture!!!

     Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE1);       
     tex2.bind(1);
     shader.setUniformi("u_texture2", 1); //passing second texture!!!


    shader.setUniformf(u_res, new Vector2(Gdx.graphics.getWidth(),Gdx.graphics.getHeight())); 
    shader.setUniformf(u_time, time);


    mesh.render(shader, GL20.GL_TRIANGLES);

      shader.end();
}

fragment 着色器:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoords;
uniform vec2 resolution;
uniform float u_time;
uniform sampler2D u_texture;
uniform sampler2D u_texture2;
uniform float u_temp;
const float pi = 3.14159265;

void main() 
{
vec2 p = gl_FragCoord.xy / resolution.xy;

vec4 i = texture2D(u_texture2, p);
gl_FragColor = texture2D(u_texture, p)+i;
}

如果我只传递一个纹理,一切正常。否则,我会得到意想不到的结果,就好像第一个纹理 (u_texture) 是第二个纹理 (u_texture2)。将多个纹理传递给着色器的正确方法是什么?

最佳答案

我必须按如下顺序传递纹理:

 texture.bind(1);
 shader.setUniformi("u_texture", 1); //passing first texture!!!

 texture2.bind(0);
 shader.setUniformi("u_texture2", 0); //passing second texture!!! 

关于android - 将多个纹理传递给 LibGDX 中的着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22447270/

相关文章:

android - 从哪个Android版本开始支持 "drawable-nodpi"?

java - Android 中的全景图

android - 使用 TextInputLayout 时辅助功能检查失败

java - 二维数组 - 错误的 "Wall "放置?

javascript - WebGL:优化每帧更改值和顶点计数的顶点缓冲区

java - 为什么我的 OpenGL 坐标系轴不是 [-1; 1]?

java - Android 闹钟管理器不会等待

java - libGDX - 通过 SpriteBatch 结果翻转绘制纹理

java - Box2D 库 - 为什么当动态物体卡在静态物体和另一个动态物体之间时碰撞不能正常工作?

ios - 我可以在不使用全屏 View 的情况下使用 iOS GLKit 吗?