私は、各面に異なるテクスチャを持つオブジェクト(立方体)をレンダリングする方法を理解しようとしています。簡単にするために、キューブの3つの面にそれぞれ2つのテクスチャが適用されています。使用する関連するテクスチャを表すために、3つの座標を持つテクスチャ配列を使用する必要があることを理解しています。私はこれをどうやって行うのか、フラグメントシェーダをどのようにコードするのか不明です。ここでVBOを使ったOpenGLの複数テクスチャ
は私init()
機能の関連する部分である:
final String textureName = model.getTextures().get(i).textureName;
final FileTexture textureGenerator = new FileTexture(this.getClass().getResourceAsStream(textureName),
true, context);
textureId = textureGenerator.getTextureId();
width = textureGenerator.getWidth();
height = textureGenerator.getHeight();
textureMap.put(model.getTextures().get(i).matName, textureId);
context.getGL().glActiveTexture(GL.GL_TEXTURE0 + i);
context.getGL().glBindTexture(GL.GL_TEXTURE_2D, textureId);
オレンジブック(OpenGLのシェーディング言語は)glActiveTexture
とglBindTexture
が使用されている例を示しますので、私はしかし、ここで少し混乱していますが、 GLSL common mistakesはこれをしてはいけないと言います。
そこから、私のdisplay()
関数は次のようになります。
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 3 * 4, getVertices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 2 * 4, getTexCoords(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, getNoOfIndices() * 4, getIndices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getColorBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getColors(), GL.GL_STREAM_DRAW);
layerTextureShader.use(gl);
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, mask ? getMaskColorBufferObject() : getColorBufferObject());
gl.glColorPointer(4, GL.GL_FLOAT, 0, 0);
gl.glClientActiveTexture(GL.GL_TEXTURE0);
gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(3, GL.GL_FLOAT, 0, 0);
gl.glClientActiveTexture(GL.GL_TEXTURE1);
gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(3, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
final int count = getNoOfIndices();
gl.glDrawElements(GL.GL_TRIANGLES, count, GL.GL_UNSIGNED_INT, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glClientActiveTexture(GL.GL_TEXTURE0);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glClientActiveTexture(GL.GL_TEXTURE1);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY);
layerTextureShader.release(gl);
私は私のGLSLシェーダに入れた内容が不明です。私の頂点シェーダは標準gl_TexCoord[0] = gl_MultiTexCoord0;
を持っており、私のフラグメントシェーダは、次のようになります。私が使用するテクスチャのフラグメントシェーダに指示するにはどうすればよい
uniform sampler2D texture;
void main()
{
gl_FragColor = texture2D(texture, gl_TexCoord[0].st);
}
?私はそれが頂点、インデックス、テクスチャバッファなどを埋めるときだと仮定し、各ポイントの3番目のテクスチャ座標を渡すことでそれを行いますか?この3番目の座標の値は、関連するテクスチャ座標の値ですか? 私の質問が意味を持ち、どんな助けでもありがとうと思います。 クリス
私はテクスチャを作成するときにglTexImage2Dの代わりにglTexImage3Dを使用し、3番目の座標をインデックスとして使用してそれらにアクセスする必要があると仮定して正しいでしょうか? –
いいえ、現在行っていることの多くは同じままです。まもなくキューブマップサンプルをお見せします。 – TheBuzzSaw