iOS 上 OpenGL ES2.0 中的多纹理点精灵?

2024-04-24

我正在尝试使用 OpenGL ES 2.0 为 iPhone 应用程序制作多纹理点精灵。我在网上找不到任何这样的例子,而且它似乎不起作用。当对点精灵使用 GL_POINTS 模式时,是否有一些内置限制使得 gl_PointCoord 不能在多个纹理上使用?

uniform sampler2D tex;    
uniform sampler2D blur_tex;
vec4 texPixel = texture2D( tex, gl_PointCoord ); 
vec4 blurPixel = texture2D( blur_tex, gl_PointCoord );

我确信我正确地传递了纹理,因为我可以在 TRIANGLE_STRIP 模式下很好地进行多重纹理,但我希望使用点精灵来加快速度。

If it is可能的话,指向工作代码示例的链接将会非常有帮助。谢谢!

EDIT:

以下是我将纹理传递给着色器的方式。当我处于 TRIANGLE 或 TRIANGLE_STRIP 模式时,这可以让我进行多重纹理处理。

//pass in position and tex_coord attributes...

//normal tex
glActiveTexture(0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex0);
glUniform1i(SAMPLER_0_UNIFORM, 0);

//blur tex
glActiveTexture(1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex1);
glUniform1i(SAMPLER_1_UNIFORM, 1);
//draw arrays...

但是,如果我使用 POINTS 模式,那么我永远不会看到第二个纹理。也就是说,参考上面的shader代码,我是否

gl_FragColor = texPixel;

OR

gl_FragColor = 模糊像素;

我看到相同的纹理。这看起来很奇怪。我的猜测是,您不能在点精灵上进行多重纹理,并且以某种方式拥有两个活动纹理或两次调用 gl_PointCoord 会导致问题。但我希望我错了。因此,如果有人有一个在 OpenGL ES 2.0 中使用点精灵进行多纹理处理的简单示例,我会很乐意查看该代码!

EDIT 2:

顶点着色器:

attribute vec4 position;

void main() {
  gl_PointSize = 15.0;   
  gl_Position = position;
}

片段着色器:

precision mediump float; 

uniform sampler2D tex;    
uniform sampler2D blur_tex;

void main() {
  vec4 texPixel = texture2D( tex, gl_PointCoord ); 
  vec4 blurPixel = texture2D( blur_tex, gl_PointCoord );

  //these both do the same thing even though I am passing in two different textures?!?!?!?

  //gl_FragColor = texPixel;
  gl_FragColor = blurPixel;
}

您的主程序中有一个拼写错误。

传递给 glActiveTexture 的正确参数是 GL_TEXTURE0, GL_TEXTURE1, ...

请注意,GL_TEXTURE0、GL_TEXTURE1 的值不是 0,1 等。

由于您向 glActiveTexture 传递了无效值,因此该函数将失败,因此活动纹理将始终是默认值(可能是 0),所有更改都将在 0 位置处进行纹理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 上 OpenGL ES2.0 中的多纹理点精灵? 的相关文章

随机推荐