iOS OpenGL ES 3.0 中的 texture3D 插值
Interpolation in texture3D in OpenGL ES 3.0 on iOS
我正在将 GL_TEXTURE_3D 传递给 iOS 应用程序中的片段着色器。我正在使用缩小和放大过滤器作为此纹理的 GL_LINEAR。但是,在应用程序中渲染的结果纹理有块而不是平滑的颜色过渡,这意味着它正在使用 GL_NEAREST 插值。
以下是预期输出图像与接收输出图像的屏幕截图
PS:如果我改用 2D 纹理,将 3D 纹理作为展平的 2D 纹理传入,并在着色器中手动进行插值,一切正常,我得到了预期的输出。
这里是设置代码 GL_LINEAR
:
GLenum target, minificationFilter, magnificationFilter;
target = GL_TEXTURE_3D;
minificationFilter = GL_LINEAR;
magnificationFilter = GL_LINEAR;
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minificationFilter);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magnificationFilter);
如果您从单精度浮点格式 GL_RGBA32F
切换到半浮点格式 GL_RGBA16F
,则 GL_LINEAR
放大效果很好。
我找不到任何文档来说明为什么这不起作用,而且单精度浮点纹理的唯一限制似乎是用作渲染目标时,所以我想这是一个要归档的错误“GL_RGBA32F
忽略 GL_LINEAR
放大 iOS 9”。
如果它真的是一个错误,那么请理解 - 我认为 OpenGLES 3
实现是最大、最糟糕的 switch 语句驱动的部分之一可能不幸要处理的代码。如果你认为这份工作以前可能具有的魅力已经被更快、更性感和无遗留问题 Metal 的发布吸走了,那么你可能正在谈论一个非常不受欢迎的代码库,由一些非常不受欢迎的人维护不快乐的人。 你很幸运,平面阴影三角形甚至可以工作。
p.s。使用 GL_TEXTURE_3D
时不要忘记夹在 third 坐标 (GL_TEXTURE_WRAP_R
)
p.p.s 在设备上进行测试。 GL_RGBA32F
和 GL_RGBA16F
似乎都无法在模拟器上使用 GL_LINEAR
ES 3.0 不支持内部格式 GL_RGBA32F
的纹理线性过滤。
您可以在第 130-132 页的 ES 3.0 规范文档的 table 3.13 中查看哪些格式支持线性过滤。最后一列 header "Texture-filterable" 表示哪些格式支持过滤。 RGBA32F
该列中没有复选标记。
如果您需要对浮点纹理进行线性过滤,则仅限于 16 位分量浮点。同一个 table 中的 RGBA16F
在最后一列中有复选标记。
此限制在最新的 ES 3.2 规范中仍然存在。
有一个扩展可以解除这个限制:OES_texture_float_linear. However, this extension is not listed under the supported extensions on iOS。
我正在将 GL_TEXTURE_3D 传递给 iOS 应用程序中的片段着色器。我正在使用缩小和放大过滤器作为此纹理的 GL_LINEAR。但是,在应用程序中渲染的结果纹理有块而不是平滑的颜色过渡,这意味着它正在使用 GL_NEAREST 插值。
以下是预期输出图像与接收输出图像的屏幕截图
PS:如果我改用 2D 纹理,将 3D 纹理作为展平的 2D 纹理传入,并在着色器中手动进行插值,一切正常,我得到了预期的输出。
这里是设置代码 GL_LINEAR
:
GLenum target, minificationFilter, magnificationFilter;
target = GL_TEXTURE_3D;
minificationFilter = GL_LINEAR;
magnificationFilter = GL_LINEAR;
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minificationFilter);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magnificationFilter);
如果您从单精度浮点格式 GL_RGBA32F
切换到半浮点格式 GL_RGBA16F
,则 GL_LINEAR
放大效果很好。
我找不到任何文档来说明为什么这不起作用,而且单精度浮点纹理的唯一限制似乎是用作渲染目标时,所以我想这是一个要归档的错误“GL_RGBA32F
忽略 GL_LINEAR
放大 iOS 9”。
如果它真的是一个错误,那么请理解 - 我认为 OpenGLES 3
实现是最大、最糟糕的 switch 语句驱动的部分之一可能不幸要处理的代码。如果你认为这份工作以前可能具有的魅力已经被更快、更性感和无遗留问题 Metal 的发布吸走了,那么你可能正在谈论一个非常不受欢迎的代码库,由一些非常不受欢迎的人维护不快乐的人。 你很幸运,平面阴影三角形甚至可以工作。
p.s。使用 GL_TEXTURE_3D
时不要忘记夹在 third 坐标 (GL_TEXTURE_WRAP_R
)
p.p.s 在设备上进行测试。 GL_RGBA32F
和 GL_RGBA16F
似乎都无法在模拟器上使用 GL_LINEAR
ES 3.0 不支持内部格式 GL_RGBA32F
的纹理线性过滤。
您可以在第 130-132 页的 ES 3.0 规范文档的 table 3.13 中查看哪些格式支持线性过滤。最后一列 header "Texture-filterable" 表示哪些格式支持过滤。 RGBA32F
该列中没有复选标记。
如果您需要对浮点纹理进行线性过滤,则仅限于 16 位分量浮点。同一个 table 中的 RGBA16F
在最后一列中有复选标记。
此限制在最新的 ES 3.2 规范中仍然存在。
有一个扩展可以解除这个限制:OES_texture_float_linear. However, this extension is not listed under the supported extensions on iOS。