java - 使用多个 sampler2D 的 GLSL 着色器

标签 java opengl glsl libgdx

我正在尝试开发一个使用两个 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/

相关文章:

c - 仅使用 C 语言的 OPENGL 3D 世界中的物理

opengl - GLSL - 计算片段的法线

java - 将文件写入磁盘时锁定文件

java - 如何从Assets文件夹中获取特定的图像资源?

OpenGL 动态对象运动模糊

glsl - SceneKit - 获取屏幕坐标中的位置

opengl - 使用 GLSL 计算着色器渲染纹理时遇到问题

java - Hadoop mapReduce 如何在 HDFS 中只存储值

java - 使用 JAVA 的 struts2 中的简单登录 Web 应用程序的第二页未加载?

opengl - GLSL abs() 坏了?