gpt4 book ai didi

ios - GLKit 混合两种纹理

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:13 25 4
gpt4 key购买 nike

我正在尝试转换 OGL ES 1.1。代码到 GLKit。 GLKit 提供了一对纹理插槽:

  1. 纹理2d0
  2. 纹理2d1

每个纹理都有一个环境模式:

  1. GLKTextureEnvModeReplace,
  2. GLKTextureEnvModeModulate,
  3. GLKTextureEnvModeDecal

通常,您将 texture2d1 留空,只设置 texture2d0。我假设 - 通过阅读 Apple 的文档 - 2d1 用于混合/组合/修改纹理。由于 GLKit“仅仅”位于着色器之上,并且每个着色器都有一对纹理槽是标准的——“传入”槽代表 Material 上已有的内容,“修改”槽代表着色器处理的内容将用作修改 Material 的参数。

但这似乎行不通。

我试过:

self.baseEffect.texture2d0.envMode = GLKTextureEnvModeReplace;
self.baseEffect.texture2d0.target = GLKTextureTarget2D;
self.baseEffect.texture2d0.name = [earthTextureDefault name];

self.baseEffect.texture2d1.envMode = GLKTextureEnvModeModulate;
self.baseEffect.texture2d1.target = GLKTextureTarget2D;
self.baseEffect.texture2d1.enabled = TRUE;
self.baseEffect.texture2d1.name = [textureClouds name];

...我得到的只是一个黑色的非纹理。将任一纹理放入 0(1 中没有任何内容)都可以正常工作。第二个纹理是 alpha 到白色的阴影,其中第一个纹理是完全不透明的,但具有相当丰富的调色板。

我真正想做的是开始高效地应用动态生成/更新的混合。例如:

  1. 加载基础纹理
  2. 加载第二个纹理
  3. 加载一个在它们之间混合的混合蒙版
  4. ...逐帧更新混合蒙版。无需重新上传前两个纹理

注意:我不打算丢弃 GLKit 并为此编写自定义着色器。我想了解 GLKit 的工作原理 - 从外观上看,与编写一堆着色器相比,维护这样简单的东西应该容易得多。

最佳答案

As noted in the documentation , GLKTextureEnvModeModulate将纹理的颜色值相乘,这可能就是您看到黑色的原因。如果你想在没有 alpha 的纹理上覆盖一个带 alpha 的纹理,使用 GLKTextureEnvAttribDecal相反。

我看不出有什么方法可以仅使用 GLKit API 实现动态混合蒙版的想法,但您不必完全放弃它。尝试这样的事情:

  1. 加载三个纹理对象:基础纹理、第二个纹理和混合蒙版。
  2. 创建一个帧缓冲区对象,其颜色附件是第四个纹理。
  3. 使用着色器渲染到纹理 FBO,着色器使用来自第二个纹理的 RGB 值和来自混合蒙版的 alpha 值填充它。
  4. 使用基础纹理作为texture0 FBO 纹理为 texture1用你的GLKBaseEffect并将您的主要场景渲染到屏幕上。
  5. 更新混合蒙版时重复步骤 3-4。

它的效率可能不如在一次渲染过程中完成所有操作的片段着色器,但它应该可以工作。

关于ios - GLKit 混合两种纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com