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纹理相比。那我在做错什么?
答案 0 :(得分:0)
根据你的代码,当纹理大小为256x256时,To2DCoords()的输入和输出应该是像素坐标(0~255),而不是纹理坐标(0~1.0)。
您的代码应如下所示:
gl_FragColor = texture2D(s_texture,To2DCoords(texCoords*3DTextureSize)/2DTextureSize);