Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在iOS中使用三维纹理?_Iphone_Ios_Opengl Es_Opengl Es 2.0 - Fatal编程技术网

Iphone 如何在iOS中使用三维纹理?

Iphone 如何在iOS中使用三维纹理?,iphone,ios,opengl-es,opengl-es-2.0,Iphone,Ios,Opengl Es,Opengl Es 2.0,我在OpenGL ES 2.0中找不到OpenGL中的glTexImage3D()函数。那么如何使用三维纹理,例如.tga文件 有人知道如何在OpenGL ES 2.0中使用三维纹理吗 我在OpenGL ES 2中找不到GLTEXAGE3D函数 因为OpenGL ES不支持3D纹理。想想看:3D纹理比2D纹理需要更多的内存。而内存是嵌入式/移动设备上非常稀缺的资源,这正是ES的目标 我想也许有人知道使用3d纹理的算法 这与其说是一个算法问题,不如说是一个资源有限的问题。理论上,您可以使用多个纹理

我在OpenGL ES 2.0中找不到OpenGL中的
glTexImage3D()
函数。那么如何使用三维纹理,例如.tga文件

有人知道如何在OpenGL ES 2.0中使用三维纹理吗

我在OpenGL ES 2中找不到GLTEXAGE3D函数

因为OpenGL ES不支持3D纹理。想想看:3D纹理比2D纹理需要更多的内存。而内存是嵌入式/移动设备上非常稀缺的资源,这正是ES的目标

我想也许有人知道使用3d纹理的算法

这与其说是一个算法问题,不如说是一个资源有限的问题。理论上,您可以使用多个纹理单元/采样器在那里上载层,并在着色器中进行插值。但这将缺少深度mipmapping

3d纹理,例如:。标记文件


标签文件?对不起,我不知道这种格式。你能给我一个链接让我读一下吗?谷歌没有找到有用的信息。你的意思是TGA吗?

OpenGL ES 1.x和2.x不强制支持3d纹理-例如,请参阅的规范手册页,其中仅列出了
GL\u纹理\u 2D
GL\u纹理\u立方体\u贴图
作为目标-并且iOS硬件没有提供任何合适的扩展

我能想到的最好的解决方案是将一个3d纹理打包成2d纹理,比如说一个128x128x128 3d纹理,然后将它作为128个单独的128x128图像,在一个16x8网格中,在一个2d纹理上。因此,2d纹理为2048x1024像素,接近iPhone 4和iPad 2代设备以及之前兼容ES 2.0的iOS设备的硬件限制

然后,将3d纹理坐标输入到片段着色器,就像有一种方法可以对3d纹理进行本机索引一样,但请快速进行数学运算,将其折叠为2d

因此,在128x128x128示例中,您可以执行以下操作(如我所说,在这里编码,未经测试):

这可能不是实现这一目标的最有效方式,它是为了(相对)清晰而写的。您还看到了每个纹理读取都是依赖的,这会带来显著的性能劣势(即,GPU无法预测片段着色器之外的访问,从而导致严重的管道困难)。但这需要与使用3d纹理贴图以外的其他东西所需的任何成本进行权衡

还要注意,您正在执行一个绑定到特定z片的访问。因此,您只能在至少一个维度上进行
GL_NEAREST
类型的采样,除非您想进行两次采样,并自行混合结果,而且成本更高。我也没有做任何关于夹紧的事情,你很可能想解决这个问题

Datenwolf(+1,顺便提一下)也完全正确地认为mipmapping是一个问题;我最后只是禁用了它



2013年末附录:撰写本文时,iOS 7、iPhone 5s、第二代iPad Mini和iPad Air都支持ES 3.0。3.0引入了
GL\u纹理\u 3D
目标。因此,您可以在这些设备上直接使用3d纹理,可能还有未来所有的iOS设备。而且,作为记录,Android上也有类似的可用性,最近所有的Nexus设备、HTC One、一些最近的三星和其他设备都支持它。

谢谢你的回答!事实上,我不确定我需要的是3d纹理。这是我第一次用opengl es做一些工作。我接受一个项目,我需要渲染屏幕上的房子。当我打开.obj文件时,我发现每个vt都有三个分量,不仅仅是vt。如果忽略vt的第三个分量,纹理会非常奇怪。也许我不必使用3d纹理?我把纹理图像放在下面。也许你们知道我需要什么。ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg,最终效果与普通2d纹理相似;你还记得OBJ存储y纹理坐标的方式与OpenGL相反,所以你需要在管道中的某个地方快速执行1-y操作吗?呃。。。我没有那样做!谢谢我会试试的@这取决于您使用的创作工具。至少,很可能3ds max和Blender也会在左下角使用(0,0)(D3D的惯例是在左上角使用(0,0)),谢谢您的回答!事实上,我不确定我需要的是3d纹理。这是我第一次用opengl es做一些工作。我接受一个项目,我需要渲染屏幕上的房子。当我打开.obj文件时,我发现每个vt都有三个分量,不仅仅是vt。如果忽略vt的第三个分量,纹理会非常奇怪。也许我不必使用3d纹理?我把纹理图像放在下面。也许你们知道我需要什么。ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg和@Ning的最终效果:第三个分量
w
起到了缩放参数的作用。你不需要它。
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