2012-02-24 187 views
4

OpenGL ES 2.0通過擴展支持3D紋理。很遺憾,許多設備都不支持這種類型的擴展。所以我triyng要做的是使用2D紋理而不是3D紋理。首先,我已經將3D紋理數據渲染爲2d紋理的圖集。例如,我將擁有包含4個2D紋理(128x128)的2d紋理圖集,而不是具有128x128x4的3d紋理。片段着色器會是這個樣子:如何在OpenGL ES 2.0中使用2D紋理渲染3d紋理數據?

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

根據您的代碼,例如,當紋理尺寸爲256x256時,To2DCoords()的輸入和輸出應該在像素座標(0〜255)中,而不是在紋理座標中(0〜1.0)。

您的代碼應該是這樣的:

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

謝謝您的答覆。似乎有相同的結果。但是我改變了To2DCoords方法,並且我有更好的結果。 – Lucian 2012-02-27 10:13:49