2012-02-24 13 views
4

OpenGL ES 2.0は拡張機能を使用して3次元テクスチャをサポートしていますが、このタイプの拡張機能は多くのデバイスでサポートされていません。だから、私はtriyngで3Dテクスチャの代わりに2Dテクスチャを使用しています。まず、3Dテクスチャデータを2次元テクスチャのアトラスに疲れさせました。たとえば、128x128x4の3Dテクスチャの代わりに、4つの2Dテクスチャ(128x128)を含む2Dテクスチャアトラスがあります。フラグメントシェーダは、次のようになります:OpenGL ES 2.0で3dテクスチャデータを2次元テクスチャでレンダリングするには?

precision mediump float; 
uniform sampler2D s_texture; 
uniform vec2 2DTextureSize; 
uniform vec3 3DTextureSize; 
varying vec3 texCoords; 
vec2 To2DCoords(vec3 coords) 
{ 
float u = coords.x + 3DTextureSize.x*(coords.z - 2DTextureSize.x *floor(coords.z/2DTextureSize.x)); 
float v = coords.y + 3DTextureSize.y*floor(coords.x/2DTextureSize.x); 
return vec2(u,v); 
} 
void main() 
{ 
    gl_FragColor = texture2D(s_texture,To2DCoords(texCoords)); 
} 

方法To2DCoordsはで発見アルゴリズムに触発さ:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch29.html

問題がでeverytingが3Dテクスチャと比較すると、めちゃくちゃされてレンダリングすることです。だから私は間違っているの?

答えて

0

To2DCoords()の入出力は、テクスチャサイズが256x256の場合、テクスチャ座標(0〜1.0)ではなく、ピクセル座標(0〜255)で入力する必要があります。あなたのコードは次のようになります

gl_FragColor = texture2D(s_texture,To2DCoords(texCoords*3DTextureSize)/2DTextureSize); 
+0

はご回答いただきありがとうございます。同じ結果が出ているようだ。しかし、私はTo2DCoordsメソッドを変更してより良い結果を得ました。 – Lucian