2012-02-24 526 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