2017-09-02 17 views
0

テクスチャ配列をシェーダにロードしようとしています。私が直面している問題は、最後に読み込まれたテクスチャを配列に描画することしかできないことです。TEXTURE_2D_ARRAY内に格納されているテクスチャにアクセスする際の問題

:私は私のドローループ内で、その後

// Allocate the array 
width := 32 
height := 32 
var textureArray uint32 
gl.GenTextures(1, &textureArray) 
gl.BindTexture(gl.TEXTURE_2D_ARRAY_EXT, textureArray) 
gl.TexStorage3D(gl.TEXTURE_2D_ARRAY_EXT, 1, gl.RGBA, width, height, layerCount) 
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_MIN_FILTER, gl.LINEAR) 
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_MAG_FILTER, gl.LINEAR) 
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) 
gl.TexParameteri(gl.TEXTURE_2D_ARRAY_EXT, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) 

// Load the textures into the array (assume rgbaN.Pix returns an RGBA image 
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 0, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba0.Pix)) 
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 1, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba1.Pix)) 
gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT, 0, 0, 0, 2, width, height, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(rgba2.Pix)) 

:奇妙なことに、これは私が(私は行くバインディングを使用していますが、一般的な考え方がクリアされている)のような質感の配列を作成したインデックスは0で常にあります私はいつも、アレイに最後に追加されたテクスチャを描き、このシェーダで

#version 110 
#if GL_EXT_texture_array 
#extension GL_EXT_texture_array : enable 
#endif 

varying vec2 texCoord; 

uniform sampler2DArray texArray; 

void main() 
{ 
    gl_FragColor = texture2DArray(texArray, vec3(texCoord, 0.0)); 
} 

gl.BindTexture(gl.TEXTURE_2D_ARRAY_EXT, textureArray) 
gl.BindVertexArray(vertexArray) 
gl.DrawElements(gl.TRIANGLES, int32(len(indices)), gl.UNSIGNED_INT, nil) 

私のシェーダはこのようになります。 vec3(texCoord, 0.0)vec3(texCoord, 1.0)のように変更すると、黒さが増えます。何も描かれません。私の現在の考え方は、私がユニフォームを正しく割り当てていないということですが、それを修正する方法はわかりません。

+0

ES 2.0で3Dテクスチャをどのように行う予定ですか? – genpfault

+0

@genpfault GL_EXT_texture_array拡張は、テクスチャ配列内に2Dテクスチャを格納することができると思います。または私は間違っていますか? – Max

+0

[ESレジストリ拡張リスト](https://www.khronos.org/registry/OpenGL/index_es.php)の 'GL_EXT_texture_array'が表示されません。 – genpfault

答えて

0

glTexImage3D()関数は、の3D(または2D配列)テクスチャ全体を作成します。 depthパラメータは、画像自体の深度(すなわち、2Dアレイ内の面の総数)である。したがって、2番目のプレーンを読み込むと、最初のプレーンが置き換えられ、3番目のプレーンを読み込むと、2番目のプレーンが置き換えられます。

3D(または2D配列)テクスチャを一度に1つずつ読み込みたい場合は、glTexSubImage3Dを使用します。これは、配列境界をオーバーランします。

+0

お役立ち情報gl.TexSubImage3D(gl.TEXTURE_2D_ARRAY_EXT、0、0、0、0、width、height、、gl.RGBA、 \t \t gl.UNSIGNED_BYTE、gl.Ptr(rgbaN.Pix)) 'に変更しました。何も表示されません。他のリード? – Max

+0

@Max: 'glTexSubImage3D'のドキュメントを慎重に読みましたか?各パラメータの意味についての説明は? –

+0

はい、私はしましたが、それは明らかではありません。特にこの部分は、2次元配列テクスチャの場合、zインデックスはスライスインデックスを参照します。これは、z-インデックスが配列へのオフセットでなければならないことを意味し、深さは常に1にする必要がありますか? – Max

関連する問題