2011-10-13 13 views
5

マルチテクスチャリングを使用してオブジェクトをレンダリングする必要がありますが、両方のテクスチャが同じオブジェクトに対して異なるuv座標を持っています。 1つは法線マップ、もう1つはライトマップです。OpenGL ES 1異なるuv座標でのマルチテクスチャ化

これに関する有用な資料をご提供ください。

+0

ようこそStackOverflowへ、私はあなたが[FAQ](http://stackoverflow.com/faq#howtoask)を読むことを願っています。 –

答えて

6

OpenGL ES 2では、とにかくシェーダを使用しています。どのようなテクスチャ座標でも自由に使用できます。ただ、第二テクスチャcooridnateペアのための追加の属性を導入し、いつものように、フラグメントシェーダにこれを委任:

... 
attribute vec2 texCoord0; 
attribute vec2 texCoord1; 

varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... 
    vTexCoord0 = texCoord0; 
    vTexCoord1 = texCoord1; 
} 

とフラグメントシェーダでテクスチャをアクセスするために、それぞれの座標を使用します。

... 
uniform sampler2D tex0; 
uniform sampler2D tex1; 
... 
varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... = texture2D(tex0, vTexCoord0); 
    ... = texture2D(tex1, vTexCoord1); 
} 

もちろん、この新しい属性にデータを提供する必要があります(glVertexAttribPointerを使用)。しかし、このすべてがあなたにとって非常に寂しいと思われる場合は、GLSLシェーダを少し深く掘り下げてみるか、OpenGL ES 1を実際に使用する必要があります。この場合、質問を取り返して回答を更新します。

編集: OpenGL ES 1用のアップデートによれば、状況は少し異なります。私はあなたがすでに単一のテクスチャを使用する方法を知っていて、これに対してテクスチャ座標を指定していると仮定します。そうでなければ、マルチテクスチャリングを調べる前にそこから開始する必要があります。

glActiveTexture(GL_TEXTUREi)では、i番目のテクスチャユニットを有効にすることができます。テクスチャ状態に関する以下の操作はすべて、i番目のテクスチャユニット(glBindTextureのほか、glTexEnvおよびgl(En/Dis)able(GL_TEXTURE_2D)など)を参照します。テクスチャを指定するための

は、あなたはまだ、単一のテクスチャと同じように、 glTexCoordPointer機能を使用する座標が、 glCientActiveTexture(GL_TEXTUREi)であなたは glTexCoordPointerglEnableClientAttrib(GL_TEXTURE_COORD_ARRAY)に次の呼び出しが参照するテクスチャユニットを選択することができます。

だから、のようになります。

//bind and enable textures 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, <second texture>); 
glTexEnv(<texture environment for second texture>); //maybe, if needed 
glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, <first texture>); 
glTexEnv(<texture environment for first texture>); //maybe, if needed 
glEnable(GL_TEXTURE_2D); 

//set texture coordinates 
glClientActiveTexture(GL_TEXTURE1); 
glTexCoordPointer(<texCoords for second texture>); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0); 
glTexCoordPointer(<texCoords for first texture>); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

//other arrays, like glVertexPointer, ... 

glDrawArrays(...)/glDrawElements(...); 

//disable arrays 
glClientActiveTexture(GL_TEXTURE1); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

//disable textures 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glDisable(GL_TEXTURE_2D); 

それらを設定した後、我々は、テクスチャユニットアクティブ0で終わるように、私は最初のテクスチャ前に、第2のテクスチャのパラメータを設定する理由は唯一です。私はすでに、描画時に問題を起こしているドライバーと、ユニット0以外の別のユニットがアクティブだったと思っています。最後に多かれ少なかれクリーンな状態を残すことは常に良い考えです。つまり、デフォルトのテクスチャユニット(GL_TEXTURE0)がアクティブであることを意味します。それ以外の場合、マルチテクスチャを気にしないコードで問題が発生する可能性があります。

EDIT:あなたが代わりに頂点配列の即時モード(glBegin/glEnd)を使用する場合は、当然のことながら、glTexCoordPointerを使用しないでください。この場合はもちろん、glClientAttribTextureは必要ありません。 glTexCoord(...)ではなく、適切なテクスチャユニット(GL_TEXTURE0GL_TEXTURE1、...)を使用してglMultiTexCoord(GL_TEXTUREi, ...)を使用するだけです。しかし、私に正しく知らされていれば、OpenGL ESには即時モードはありません。

+0

あなたのfeedback.nowのためにありがとう私はopenglesで私の質問をretargetしました。 OpenGL ESでこれを行う方法を親切に解決策を提示してください。1.利用可能であれば、サンプルコードを提供してください。前もって感謝します。 – rocksvick

+0

@rocksvick opengl-esタグを追加しましたが、opengl-es-2.0タグを削除したり、タイトルを変更したりしていません。したがって、OpenGL ES 1.1ソリューションまたはOpenGL ES 2.0ソリューションのみ、あるいはその両方が必要ですか? –

+0

あなたのガイドラインに従って、私はopengl-es-2.0タグを削除してタイトルを変更しました。可能であれば、ソリューションとサンプルコードをご提供ください。ありがとう – rocksvick

関連する問題