如何在OpenGL ES 2.0中使用2d纹理渲染3d纹理数据?

时间:2012-02-24 14:18:58

标签: opengl-es-2.0 textures

OpenGL ES 2.0通过扩展支持3d纹理。遗憾的是,许多设备都不支持这种类型的扩展。所以我要做的就是使用2d纹理而不是3d纹理。首先,我将3D纹理数据变成了2d纹理的图集。例如,我将拥有一个包含4个2D纹理(128x128)的2D纹理图集,而不是具有128x128x4的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

中的算法

问题在于渲染每个都搞砸了,与3d纹理相比。那我在做错什么?

1 个答案:

答案 0 :(得分:0)

根据你的代码,当纹理大小为256x256时,To2DCoords()的输入和输出应该是像素坐标(0~255),而不是纹理坐标(0~1.0)。

您的代码应如下所示:

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