2016-05-22 2 views
0

Я действительно застрял в этой проблеме. Мне нужно связать текстуру с шейдером, чтобы использовать ее как карту смещения. Вот мой код:Как связать дополнительную текстуру с шейдером. 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

Чтобы установить шейдер форму, вы должны сначала связать шейдер:

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

Примечания выше имеет только сделать один раз, а значение будет придерживаться затенения.

Вы правильно привязываете текстуру, но это хорошая идея сделать это до batch.begin(), если вы привязываете какую-либо другую текстуру к этой текстурной единице где-то еще в своем приложении. И вы обязательно должны позвонить Gdx.gl.glActiveTexture(GL_TEXTURE0); после привязки, потому что SpriteBatch всегда предполагает, что активная текстура оставлена ​​на 0.