如何在 iOS 中使用 3D 纹理?

2023-11-27

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

有人知道如何在 OpenGL ES 2.0 中使用 3D 纹理吗?


OpenGL ES 1.x 和 2.x 不强制要求支持 3d 纹理 - 请参阅例如规范手册页glBindTexture,其中仅列出GL_TEXTURE_2D and GL_TEXTURE_CUBE_MAP作为目标 - 并且 iOS 硬件不提供任何合适的扩展。

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

然后,您将 3D 纹理坐标输入到片段着色器中,就像有一种方法可以本地索引 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

这可能不是实现这一目标的最有效方法,它是为了(相对)清晰而编写的。您还会看到每个纹理读取都依赖的显着性能缺点(即,GPU 无法预测片段着色器外部的访问,从而导致严重的管道困难)。但这需要权衡使用 3D 纹理贴图以外的其他内容所需花费的成本。

另请注意,您正在执行与特定 z 切片相关的一次访问。所以你仅限于GL_NEAREST- 至少在一维中进行采样,除非您想要进行两个采样并以更高的成本自行混合结果。我也没有对夹紧做任何事情,您很可能想解决这个问题。

Datenwolf(顺便说一下,+1)关于 mipmap 是一个问题的说法也是完全正确的;我最终只是禁用了它。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iOS 中使用 3D 纹理? 的相关文章

随机推荐

  • 在网页上显示每秒更新的txt文件

    我有点像在黑暗中拍摄 我不知道如何做到这一点 所以一些有用教程的指针和 或链接会很棒 我有一个网站 我想显示文本文件 服务器日志 可能是嵌入的 问题是 只要服务器中发生事件 通常快于半秒 该文件就会更新 我怎样才能使网页实时显示文件 即显示
  • Vim 语法高亮显示 Python 的“else:”

    我对 Vim 中默认的 python 语法高亮感到恼火 它没有突出显示else 陈述正确 Vim 仅在 else 语句之间有一些空格时才会突出显示 else 语句else和冒号 so else 有效 但是else 才不是 它一定很容易修复
  • 可以将文本添加到 SVG 路径吗?

    是否可以将文本添加到 svg 路径 我创建了一个 svg 三角形 想在其中心添加一个字母 但不确定这是否可能 是的 看SVG1 1 规范第 10 13 节 标题为 路径上的文本 有关使用textPath元素 总结 给你的路径一个id属性 C
  • 完全外连接,在 2 个数据表上,带有列列表

    我有2个数据表 我不知道它们的数据列列表 该列表必须在运行时提取 并用于完整外连接 使用这些列时 需要合并两个表之间的列 并且我需要显示所有数据 到目前为止我正在做的是 获取公共列 使用 intersect 并实现 IEqualityCom
  • Razor View 抛出“当前上下文中不存在名称“模型””

    在我的 MVC 4 应用程序中进行重大重构后 Razor 在调试视图时显示此错误 当前上下文中不存在名称 model 这是有问题的代码行 model ICollection
  • 应该先考虑什么——设计模式还是代码?

    我正在开始一个全新的项目 我应该查看我的规范并决定应用哪些设计模式 还是只是提出一个总体的组织理念并允许模式通过重构有机地出现 根据您的经验 哪种技术最有成效并且更有可能产生干净优雅的代码 我还想知道是否有一些设计模式不是由 GoF 定义的
  • 将 SSIS 出价与 Visual Studio 2012 / 2013 结合使用

    我想在 Visual Studio 2012 中使用 SSIS BIDS 项目 我安装了 Visual Studio 2010 和 Visual Studio 2012 以及 Microsoft SQL 服务器2012 首先安装了 VS 2
  • 为什么 HTML5 不支持 font 元素?

    我只是真的很好奇 希望有人能在 W3C 的疯狂中揭示这个方法 最新的HTML5标准不支持该元素的原因是什么 我知道该元素在 HTML 4 01 中已被弃用 但我不明白为什么 对我来说 这似乎完全合乎逻辑 您有一段文本 只想更改字体 或者使用
  • set issubset 性能差异取决于参数类型

    为什么提出此问题呢 我试图回答这个问题 检查所有值是否作为字典中的键存在比生成器理解更好的东西all 与某些函数执行的隐式循环相比 Python 循环即使在推导式中也会减慢执行速度 all i in bar for i in foo whe
  • 如何检索 UITableView 的 UISwitch 行号?

    我已经尝试了此处发布的几种方法 但我无法让我的表充满开关来返回已更改开关的单元格的索引值 我正在以编程方式创建包含表的视图 无 xib TableSandboxAppDelegate m我实例化视图控制器didFinishLaunching
  • Eclipse android 项目不创建空白活动

    每次我创建一个新的 android 项目时 我都会指定要创建空白活动 我进入了我为其命名的页面 但是点击完成后 空白的Activity就找不到了 我知道我可以手动创建空白活动文件 但我想知道为什么 Eclipse 没有创建空白活动 即使它在
  • 传递父类作为参数?

    是否可以在创建实例之前不指定父类 例如像这样的东西 class SomeParentClass something class Child unspecifiedParentClass something instance Child So
  • php类中的回调函数

    由于某些原因 我们的托管公司使用 PHP 5 2 甚至没有预安装 mysqli 和 PDO 我别无选择 只能重写部分代码以使其兼容 5 2 所以 这是我的问题 在 PHP 5 2 中 不支持匿名函数 因此我做了以下测试以确保我正确更改了代码
  • iOS 使 UIImage 的一部分透明

    我有一个 UIImage 其中一部分已被用户选择清除 使其透明 为了进行选择 我使用了 NSBezierPath 如何在 iOS 中清除 使 UIImage 的部分透明 首先 我假设您有 UIBezierPath iOS 而不是 NSBez
  • PHP cURL HTTP 代码返回 0

    我不明白 当我 echo httpCode 时 我总是得到 0 当我将 html brand 更改为损坏的网址时 我期待 404 有什么我想念或不知道的吗 谢谢 check if url exist ch curl init curl se
  • 如何重新构建默认的“Launcher”应用程序?

    我的目标是修改Launcher应用程序并动态修改和更改主题 我在以下位置看到了几个 家庭 应用程序http www cyrket com p android com stain46 taghome 看来他们采用了默认的主页 启动器 并对其进
  • printf 中用星号填充?

    我已经搜索了高低 但在 C 中的 printf 中 似乎只有零填充和空白填充 我正在寻找自己的填充 在本例中使用星号 例如 假设宽度为8个字符 Input 123 Ouput 123 00 Input 3输出 3 00 我怎样才能做到这一点
  • Bash 中的嵌套函数调用

    现在 我正在尝试将一个 bash 函数调用嵌套在另一个函数调用中 以便一个函数的输出用作另一个函数的输入 是否可以像我在这里尝试那样在 bash 中嵌套函数调用 首先 我定义了这两个函数 returnSomething return 5 f
  • 使用ggplot2过度绘制分组箱线图中的平均点

    我有一个像这样的 ggplot2 分组箱线图 p lt qplot factor cyl mpg data mtcars geom boxplot fill factor gear 我想透支平均点 我试过这个 p stat summary
  • 如何在 iOS 中使用 3D 纹理?

    我找不到glTexImage3D OpenGL ES 2 0 中的 OpenGL 函数 那么如何使用 3D 纹理 例如 tga 文件 有人知道如何在 OpenGL ES 2 0 中使用 3D 纹理吗 OpenGL ES 1 x 和 2 x