【问题标题】:Multi-textured Point Sprites in OpenGL ES2.0 on iOS?iOS 上 OpenGL ES2.0 中的多纹理点精灵?
【发布时间】:2011-08-11 16:45:47
【问题描述】:

我正在尝试使用 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...

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

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;
}

【问题讨论】:

  • 不是因为它一定会有所帮助,而是因为它可能 - 是否有机会发布您的完整顶点和片段着色器?
  • 好的,用vert和frag着色器更新

标签: iphone objective-c opengl-es-2.0 point-sprites


【解决方案1】:

您的主程序中有错字。

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

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

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

【讨论】:

    【解决方案2】:

    source 在我的情况下,有一个混合点

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

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

    【讨论】:

    • 是的,我有...我得到了一个大小合适的纹理(由顶点着色器中的 gl_PointSize 定义),但另一个没有出现。同样,这是使用三角形(我可以传入并混合两个单独的纹理),而不是点精灵。
    • 制作 gl_FragColor=vec4(1,0,0,1) 以确保它是否在正确的位置。如果您会看到红色四边形,则混合存在问题,如果您看不到红色四边形,则位置或参数有问题
    • 但是是的,位置和 tex_coords 是正确的,当我将碎片颜色设置为红色时,我确实看到了一个红色矩形。
    • 您好,谢谢,您可以用点精灵尝试一下并确认它有效吗?我认为问题可能在于调用 gl_PointCoord 两次,这只在 GL_POINTS 模式下有意义(不是 GL_TRIANGLES)。
    • 是的,代码在 TRIANGLES 模式下工作,但重点是我无法让它与 POINT SPRITES 一起工作!
    【解决方案3】:

    我认为发布此内容可能为时已晚。

    您的代码中有两个问题。一个是Satyakam 指出的那个。另一个问题是你不应该使用 glUniform1f。右边是glUniform1i。尾端是 f 或 i,表示浮点数或整数。

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多