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



我正在尝试使用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模式下做多纹理,但我希望使用点精灵来加快速度。

如果可能的,链接到一个工作代码的例子将非常有帮助。谢谢!

编辑:

这是我如何传递纹理到我的着色器。这让我可以在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...

然而,如果我使用点模式,那么我永远不会看到第二个纹理。也就是说,参考上面的着色器代码,无论我是否执行

gl_FragColor = texPixel;

gl_FragColor = blurPixel;

我看到了相同的纹理。这看起来很奇怪。我的猜测是,你不能在一个点精灵上做多重纹理,不知怎么地,有两个活动纹理或两次调用gl_PointCoord会导致问题。但我希望我错了。所以,如果有人有一个简单的例子,多纹理工作与点精灵在OpenGL ES 2.0,我会很乐意看看那个代码!

编辑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位置纹理

来源在我的例子中,有一个混合点

可能的问题是不存在的参数

glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

我想现在发这个可能太晚了。

你的代码有两个问题。一个是Satyakam指出的。另一个问题是,你不应该使用glUniform1f。右边的是glUniform1i。差异为尾部i,表示浮点数或整数

最新更新