2015-11-24 56 views
0

我将GL_TEXTURE_3D传递给iOS应用程序中的片段着色器。我使用缩小和放大滤镜作为GL_LINEAR来处理这个纹理。但是,在应用中渲染的结果纹理具有块,而不是颜色的平滑过渡,这意味着它正在使用GL_NEAREST插值。 下面是预期VS接收的输出图像 expected output output receivediOS中的OpenGL ES 3.0中的texture3D中的插值

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); 
+1

你可以显示你设置GL_LINEAR的代码吗? –

+0

@RhythmicFistman:我编辑帖子以包含代码。感谢您的询问。 – user5597458

+0

这些块非常大。它可以是纹理量化吗?你如何上传纹理? –

回答

1

ES 3.0不支持线性过滤内部格式为GL_RGBA32F的纹理。

您可以在ES 3.0规范文档的表3.13页130-132页看到哪些格式支持线性过滤。最后一列,标题为“Texture-filterable”,表示哪些格式支持过滤。 RGBA32F在该列中没有复选标记。

如果您需要对浮点纹理进行线性过滤,则仅限于16位组件浮点数。在同一个表中的RGBA16F在最后一列中有复选标记。

此限制仍在最新的ES 3.2规范中。

有一个扩展来解除这个限制:OES_texture_float_linear。但是,此扩展程序未在supported extensions on iOS下列出。

+0

从'RGBA32F'切换到'RGBA16F'似乎为我做了诀窍。感谢您的详细解释并指出文档中的参考。 – user5597458

0

如果从单精度浮点格式GL_RGBA32F切换到半浮点格式GL_RGBA16F然后GL_LINEAR倍的罚款。

我无法找到任何文档来说明为什么这不应该起作用,并且单精度浮点纹理的唯一限制似乎是用作渲染目标时,所以我想这是一个错误提交到“ GL_RGBA32F忽略了iOS 9上的GL_LINEAR放大倍数“。

如果真的一个bug,然后是理解 - 我想象的OpenGLES 3实现是代码的最大,最可怕的switch语句驱动件该人可能有不幸去努力之一。如果你认为这项工作之前可能需要的任何魅力已经被释放更快,更性感和无遗价的Metal所吸引,那么你可能在谈论一个非常不受欢迎的代码库,由一些非常不高兴的人维护。 你很幸运,平坦的阴影三角形甚至可以工作

p.s.当使用GL_TEXTURE_3D不要忘记在第三夹紧坐标(GL_TEXTURE_WRAP_R

p.p.s测试此设备上。 GL_RGBA32FGL_RGBA16F似乎都不能在模拟器上使用GL_LINEAR

+0

我会尝试GL_RGBA16F并回复您。 PS - 我正在夹紧第三个坐标:)我正在设备上测试它。我同意模拟器不是很可靠。 – user5597458

+0

GL_RGBA16F而不是GL_RGBA32F与GL_LINEAR一切正常。谢谢! – user5597458