我正在尝试开发一个使用两个 sampler2D 的 GLSL 着色器,但我遇到了一些问题。
片段着色器:
varying vec4 v_color;
varying vec2 v_texCoord0;
uniform sampler2D u_texture;
uniform sampler2D my_second_texture;
void main() {
vec4 original_color = texture2D(u_texture, v_texCoord0);
gl_FragColor = original_color;
}
此着色器应输出未更改的 u_texture。
绘图代码:
spritebatch.begin();
spritebatch.setShader(my_shader);
my_shader.setUniformi("my_second_texture", 1);
Gdx.gl20.glActiveTexture(1);
my_second_texture.bind(1); //Around here is where things go wrong, I think...
Gdx.gl20.glActiveTexture(0);
Gdx.gl.glClearColor(bg_color.r, bg_color.g, bg_color.b, bg_color.a);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
spritebatch.setTransformMatrix(new Matrix4());
spritebatch.setColor(1, 1, 1, 1);
spritebatch.draw(my_first_texture, -960, -540, 1920, 1080, 0, 0, 1920, 1080, false, true);
spritebatch.end();
屏幕上的结果是 my_second_texture 拉伸(stretch)到整个屏幕。预期结果是屏幕上显示未更改的 my_first_texture。 (出于好奇:最终目标是调色板交换着色器。)
如何使用 GLSL 和 LibGDX 制作正确使用两个 sampler2D 的着色器?
最佳答案
参见 https://www.opengl.org/sdk/docs/man/xhtml/glActiveTexture.xml
texture must be one of GL_TEXTUREi
在实践中,您可以使用 GL10.GL_TEXTURE0
偏移您的单位,例如:
Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0 + unit);
请注意,Texture#bind(int unit);
(其中 unit 从零开始,因此不需要使用 GL10.GL_TEXTURE0
进行偏移)将使指定的单元处于 Activity 状态。您不必在调用 texture.bind(1);
之前调用 glActiveTexture
。
tl;博士:
...
spritebatch.setShader(my_shader);
my_second_texture.bind(1);
Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);
my_shader.setUniformi("my_second_texture", 1);
...
关于java - 使用多个 sampler2D 的 GLSL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21585069/