10

パーティクルシステムのOpenGLES2.0にテクスチャポイント(ポイントスプライトなど)を実装しようとしています。私が抱えている問題は、テクスチャが適切にマッピングされるのではなく、すべてのポイントが黒一色の正方形としてレンダリングされることです。

gl_PointCoordが実際に0.0から1.0までのx/y値を返していることを確認しました。これは、テクスチャ全体にマッピングされます。ただし、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です。このテクスチャを他のジオメトリに正常にマッピングできますが、何らかの理由でポイントにマッピングできません。

私のプラットフォームは、Android2.2を実行しているMotorolaDroidです。

4

2 に答える 2

15

テクスチャをアクティブとして選択し、通常どおりバインドします。ただし、テクスチャ ユニットを均一としてシェーダー プログラムに渡す必要があります。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);
}
于 2011-02-07T06:02:54.123 に答える