GLKit混合两种纹理

时间:2012-05-18 14:17:32

标签: ios opengl-es glkit

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

  1. texture2d0
  2. texture2d1
  3. 每个纹理都有一个env模式:

    1. GLKTextureEnvModeReplace,
    2. GLKTextureEnvModeModulate,
    3. GLKTextureEnvModeDecal
    4. 通常,您将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-to-white阴影,第一个纹理都是不透明的,但是有一个相当丰富的pallette。

      我真正想做的是开始有效地应用动态生成/更新的混合。 e.g:

      1. 加载基础纹理
      2. 加载第二个纹理
      3. 加载混合蒙版之间的混合蒙版
      4. ...逐帧更新混合蒙版。无需重新上传前两个纹理
      5. 注意:我不打算扔掉GLKit并为此编写自定义着色器。我想了解GLKit是如何工作的 - 而且对于像这样的简单事物来说,它应该是一个很容易维护的东西,而不是像我在编写一堆着色器时那样。

1 个答案:

答案 0 :(得分:0)

As noted in the documentationGLKTextureEnvModeModulate将纹理的颜色值相乘,这可能就是你看到黑色的原因。如果您想在纹理上覆盖纹理顶部的纹理,请改用GLKTextureEnvAttribDecal

我没有看到只使用GLKit API进行动态混合蒙版构思的方法,但您不必完全抛弃它。尝试这样的事情:

  1. 加载三个纹理对象:基础纹理,第二个纹理和混合蒙版。
  2. 创建一个framebuffer对象,其颜色附件是第四个纹理。
  3. 使用着色器渲染到纹理FBO,该着色器使用第二个纹理中的RGB值和混合蒙版中的Alpha值填充它。
  4. 将基础纹理用作texture0,将FBO纹理用作texture1 GLKBaseEffect,并将主要场景渲染到屏幕上。
  5. 更新混合蒙版时重复步骤3-4。
  6. 它可能不如片段着色器在一个渲染过程中完成所有效果,但它应该可以工作。