【问题标题】:GLKit blend two texturesGLKit 混合两种纹理
【发布时间】:2012-05-18 14:17:32
【问题描述】:

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

  1. texture2d0
  2. texture2d1

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

  1. GLKTextureEnvModeReplace,
  2. GLKTextureEnvModeModulate,
  3. GLKTextureEnvModeDecal

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

但这似乎不起作用。

我试过了:

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 是如何工作的 - 从外观上看,对于像这样简单的事情,维护起来应该比我到处写一堆着色器要容易得多。

【问题讨论】:

  • 您愿意为您提供处理混合模式着色器的东西吗? github.com/BradLarson/GPUImage 如果您仍希望在 GLKView 的场景中使用它,您可以在最后从中提取纹理。
  • 看起来令人印象深刻,但没有回答核心问题:我们如何使用 GLKit 的内置功能?
  • 当然,我很好奇自己是如何工作的,因为我只通过 OpenGL ES 直接处理着色器和纹理。我根本没有花太多时间在 GLKit 抽象上。只是想我会把它扔在那里,以防你对此感到沮丧并在短期内需要一些东西。
  • 不,如果我放弃 GLKit,我会写着色器。
  • 似乎没有人知道,Apple(作为对我要求提供文档的错误报告的回应)拒绝进一步记录 GLKit,即使是文档明显缺失的部分。所以我放弃了,把所有东西都移植到了着色器中......

标签: ios opengl-es glkit


【解决方案1】:

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

我没有看到仅使用 GLKit API 来实现您的动态混合蒙版想法的方法,但您不必完全抛弃它。试试这样的:

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

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

【讨论】:

  • Apple 不再允许我们为没有 GL ES 2 的设备编写应用程序,所以我认为使用 ES 1 没有意义。正如问题中所述,我切换到 ES 2 - ES 1 管道只有在 Apple 记录良好时才值得使用,但他们没有这样做。但你的答案对我来说听起来不错,所以标记为 asnwered
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多