2016-12-30 22 views
0

OpenGL4csharpライブラリでC#プログラムを入手しました。これは3Dキューブを作成し、マウスとキーボードでスペースを移動できます。同じオブジェクト上の複数のテクスチャopengl4csharp

実際、キューブには1つのテクスチャしか均一に適用されません。私の問題は、各面に異なるテクスチャを適用したいということです。

私は次のようにテクスチャ配列とtextureId配列を開始しようとした:とそれらをバインドするために、

diceTextures = new Texture[6]; 
     diceTextures[0] = new Texture("top.jpg"); 
     diceTextures[1] = new Texture("bottom.jpg"); 
     diceTextures[2] = new Texture("left.jpg"); 
     diceTextures[3] = new Texture("right.jpg"); 
     diceTextures[4] = new Texture("front.jpg"); 
     diceTextures[5] = new Texture("back.jpg"); 

     diceUint = new uint[diceTextures.Length]; 

     for (uint ui = 0; ui < diceTextures.Length; ui++) 
     { 
      diceUint[ui] = diceTextures[ui].TextureID; 
     } 

を次にOnRenderFrame方法で:

 Gl.UseProgram(program); 
     Gl.ActiveTexture(TextureUnit.Texture0); 
     Gl.BindTextures(0, diceTextures.Length, diceUint); 

しかし、何も変化し、最初1つのテクスチャだけをバインドするときと同じように、配列のテクスチャがキューブに表示されます。

テクスチャがフェイスに適用されることをどのように達成できますか?

+0

は拘束正しい食感とは別に顔を描きます。 –

答えて

1

Gl.BindTextures(0、diceTextures.Length、diceUint);

これは、6つのテクスチャを6つの別々のテクスチャユニット0〜diceTextures.Length - 1にバインドします。実際に、glBindTexture を使用する場合は、glActiveTextureコールは必要ありません。

いずれの場合でも、各フェースに異なるテクスチャを与えることを目標とする場合、まずシェーダから特定のフェイスを識別できる必要があります。つまり、各面には、他の面の頂点とは別の頂点ごとの値を与える必要があります。これはまた、そのような顔が他の顔と位置を共有することができないことを意味する。なぜなら、それらの属性の1つが対面で共有されないからである。

したがって、顔に使用するテクスチャのインデックスを含む新しいvertex attributeが必要です。

そこからarray texturesを使用できます。これらは、イメージの配列を含む単一テクスチャです。配列テクスチャからサンプリングするときは、サンプリングする配列のインデックスを(テクスチャ座標の一部として)指定できます。

テクスチャタイプにGL_TEXTURE_2D_ARRAYを使用し、各ミップマップフェースに複数の配列レイヤーを割り当てる必要があるので、これはテクスチャビルディングコードを変更します。

全体的に、シェーダコードのようになります。

#version 330 

layout(location = 0) in vec3 position; 
layout(location = 2) in vec2 vertTexCoord; 
layout(location = 6) in float textureLayer; 

out vec2 texCoord; 
flat out float layer; 

void main() 
{ 
    gl_Position = //your usual stuff. 
    texCoord = vertTexCoord; 
    layer = textureLayer; 
} 

フラグメントシェーダ:

#version 330 

in vec2 texCoord; 
flat in float layer; 

uniform sampler2DArray arrayTexture; 

out vec4 outColor; 

void main() 
{ 
    outColor = texture(arrayTexture, vec3(texCoord, layer)); 
} 
+0

私が使った解決策ではありませんが、その答えは質問です – Sorikairo

関連する問題