4

OpenGLES2.0を使用してiPhoneアプリケーション用のマルチテクスチャポイントスプライトを作成しようとしています。Webでこの例を見つけることができず、機能していないようです。ポイントスプライトに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モードを使用している場合、2番目のテクスチャは表示されません。つまり、上記のシェーダーコードを参照すると、

gl_FragColor = texPixel;

また

gl_FragColor = burnPixel;

同じ質感が見えます。これは奇妙に思えます。私の推測では、ポイントスプライトでマルチテクスチャリングを行うことはできず、どういうわけか2つのアクティブなテクスチャまたはgl_PointCoordへの2つの呼び出しがあると問題が発生します。しかし、私は私が間違っていることを望んでいます。したがって、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;
}
4

3 に答える 3

3

メインプログラムにタイプミスがあります。

glActiveTextureに渡す正しいパラメーターは、GL_TEXTURE0、GL_TEXTURE1、..です。

GL_TEXTURE0、GL_TEXTURE1の値は0、1などではないことに注意してください。

glActiveTextureに無効な値を渡しているため、関数は失敗し、アクティブなテクスチャは常にデフォルト(おそらく0)になり、すべての変更は0の位置でテクスチャに反映されます。

于 2011-05-12T20:43:59.800 に答える
1

ソース 私の場合、ポイントのブレンドがあります

考えられる問題は、存在しないパラメータにありました

glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
于 2011-04-26T06:07:01.250 に答える
1

しかし、これを投稿するには遅すぎるかもしれないと思います。

コードには2つの問題があります。1つはSatyakamが指摘したものです。もう1つの問題は、glUniform1fを使用しないことです。右はglUniform1iです。違いは、floatまたはintegerを意味するテールのfまたはiです。

于 2012-03-29T09:19:43.480 に答える