OpenGL ES 2.0中的纹理点?

时间:2010-08-16 20:31:06

标签: opengl-es sprite glsl point

我正在尝试在OpenGL ES 2.0中为粒子系统实现纹理点(例如点精灵)。我遇到的问题是所有点都呈现为纯黑色方块,而不是正确映射纹理。

我已经验证了gl_PointCoord实际上将x / y值从0.0返回到1.0,这将映射整个纹理。尽管texture2D调用似乎总是返回黑色。

我的顶点着色器:

attribute vec4 aPosition;
attribute float aAlpha;
attribute float aSize;
varying float vAlpha;
uniform mat4 uMVPMatrix;

void main() {
  gl_PointSize = aSize;
  vAlpha = aAlpha;
  gl_Position = uMVPMatrix * aPosition;
}

我的片段着色器:

precision mediump float;
uniform sampler2D tex;
varying float vAlpha;

void main () {
    vec4 texColor = texture2D(tex, gl_PointCoord);
    gl_FragColor = vec4(texColor.rgb, texColor.a * vAlpha);
}

有问题的纹理是16x16。我能够成功地将此纹理映射到其他几何体,但由于某种原因不能指向。

我的平台是摩托罗拉Droid,运行Android 2.2。

2 个答案:

答案 0 :(得分:14)

您选择纹理为活动状态并将其绑定 - 就像通常一样。但是你必须将纹理单元作为统一传递给着色器程序。因此,您可以在片段着色器中使用gl_PointCoord作为纹理坐标。

glUniform1i(MY_TEXTURE_UNIFORM_LOCATION, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, yourTextureId);
glEnable(GL_TEXTURE_2D);
glDrawArrays(GL_POINTS, 0, pointCount);
glDisable(GL_TEXTURE_2D);

您的片段着色器应该如下所示:

uniform sampler2D texture;
void main ( )
{
    gl_FragColor = texture2D(texture, gl_PointCoord);
}

答案 1 :(得分:0)

我也有类似的问题 - 我的精灵只是渲染为彩色方块,但没有出现纹理。

我需要补充一下:

glEnable( GL_POINT_SPRITE );

默认情况下,不得在所有GPU上启用纹理。