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

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

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

最佳答案

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

您的代码应如下所示:

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

关于opengl-es-2.0 - 如何在 OpenGL ES 2.0 中使用 2d 纹理渲染 3d 纹理数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432223/

相关文章:

ios - 绑定(bind)第二个顶点缓冲区似乎破坏了我的第一个顶点缓冲区,OpenGL OES ios 5.1

android - 无法将已编译的着色器链接到 OpenGL ES 2.0 Android 程序

opengl - GL_LINEAR到底使用什么算法?

c++ - 使用自定义着色器的 OpenGL/ES 渲染 = 网格上的伪影

android - 在 Android、OpenGL 中,我想使用以中心为设备屏幕中点的运动事件动态绘制一个圆,但没有获得所需的输出

java - Jogl - 图片无法加载到纹理映射程序上? (JAVA)

macos - 将模板缓冲区可视化为纹理

c - 如何在保持纹理坐标正确的同时使用 glDrawElements?

iphone - OpenGL ES 2.0 如何正确设置 glVertexAttribPointers

opengl - 平滑渲染 1.2 GB 的纹理,1 GB 的 GPU 如何做到这一点?