Nin*_*ing 8 iphone opengl-es ios opengl-es-2.0
我glTexImage3D()在OpenGL ES 2.0中找不到OpenGL 的功能.那么如何使用三维纹理,例如:.tga文件?
有人知道如何在OpenGL ES 2.0中使用3-D纹理?
Tom*_*mmy 12
OpenGL ES 1.x和2.x不强制支持3d纹理 - 例如,参见规范手册页glBindTexture,仅列出GL_TEXTURE_2D和GL_TEXTURE_CUBE_MAP作为目标 - 并且iOS硬件不提供任何合适的扩展.
我能够想出的最好的解决方案就是将3d纹理打包成2d纹理,所以你可以说是一个128x128x128的3d纹理,你可以在16x8网格中将它分成128个独立的128x128图像.单个2d纹理.所以2d纹理是2048x1024像素,接近iPhone 4和iPad 2代设备的硬件限制以及之前的ES 2.0兼容iOS设备.
然后,您可以将三维纹理坐标提供给片段着色器,就像有一种方法可以原生索引3d纹理一样,但是可以快速将数据折叠到2d.
所以,在128x128x128示例中,你会做类似的事情(在这里编码,因为我说话,未经测试):
texPos.x = sourceVarying.x / 16.0; // because we've packed 16 source images across,
texPos.y = sourceVarying.y / 8.0; // and 8 images down
// we'll multiply z by 16 since then, logically, the integer part is
// how many tiles across to index, and the decimal part is now many
// tiles down to index
texPos.z *= 16.0;
// figure out how many tiles across to index, with each tile being
// 1.0 / 16.0 in size
texPos.x += floor(texPos.z) / 16.0;
// remove the integer part of z, then multiply by 8 to do much what
// we just did to y
texPos.z = fract(texPos.z) * 8.0;
texPos.y += floor(texPos.z) / 8.0;
// now load the appropriate sample from texPos.xy
Run Code Online (Sandbox Code Playgroud)
这可能不是实现这一目标的最有效方式,它是为(相对)清晰度而编写的.您还在考虑每个纹理读取依赖的显着性能劣势(即,GPU无法预测片段着色器外部的访问,从而导致严重的管道难度).但是要考虑使用3D纹理贴图以外的其他东西而花费的成本.
另请注意,您正在进行一个与特定z切片相关联的访问.因此,GL_NEAREST除非您想要做两个样本并以更高的成本自己混合结果,否则至少在一个维度上限制为类型采样.我也没有做任何关于夹紧的事情,你很可能想要解决这个问题.
关于mipmapping是一个问题,Datenwolf(顺便提一下)也是完全正确的; 我最终只是禁用它.
2013年末的附录:在撰写本文时,iOS 7,iPhone 5s,第二代iPad Mini和iPad Air都支持ES 3.0.3.0介绍了GL_TEXTURE_3D目标.因此,您可以直接在这些设备上使用3D纹理,可能还有所有未来的iOS设备.而且,为了记录,它在Android上看到类似的可用性,在所有最近的Nexus设备,HTC One,最近的一些三星和其他设备中得到了支持.
我在 OpenGL ES 2 中找不到 glTexImage3D 函数
因为 OpenGL-ES 不支持 3D 纹理。想一想:3D 纹理比 2D 纹理需要更多的内存。而内存在嵌入式/移动设备上是非常稀缺的资源,这正是 ES 的目标。
我想也许有人知道使用 3d 纹理的算法?
这与其说是一个算法问题,不如说是一个有限资源问题。理论上,您可以使用多个纹理单元/采样器在那里上传图层,并在着色器中进行插值。但这会缺乏深度纹理贴图。
3D 纹理,例如:.tag 文件?
标签文件?抱歉,我不知道这种格式。你能给我一个链接来阅读它吗?谷歌没有找到关于它的有用信息。您可能指的是 TGA 吗?
| 归档时间: |
|
| 查看次数: |
4146 次 |
| 最近记录: |