【问题标题】:How to render 3d texture data with 2d textures in OpenGL ES 2.0?如何在 OpenGL ES 2.0 中使用 2d 纹理渲染 3d 纹理数据?
【发布时间】:2012-03-14 23:45:45
【问题描述】:

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 方法的灵感来自https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch29.html 中的算法。

问题在于,与 3D 纹理相比,渲染时一切都搞砸了。那我做错了什么?

【问题讨论】:

    标签: opengl-es-2.0 textures


    【解决方案1】:

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

    您的代码应如下所示:

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

    【讨论】:

    • 感谢您的回复。似乎有同样的结果。但是我已经改变了 To2DCoords 方法并且我得到了更好的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多