首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLKit共混两种纹理

GLKit共混两种纹理
EN

Stack Overflow用户
提问于 2012-05-18 14:17:32
回答 1查看 1K关注 0票数 3

我正在尝试转换OGL es1.1。代码到GLKit。GLKit提供一对纹理插槽:

  1. texture2d0
  2. texture2d1

每个纹理都有一个env模式:

  1. GLKTextureEnvModeReplace,
  2. GLKTextureEnvModeModulate,
  3. GLKTextureEnvModeDecal

通常,您将texture2d1保留为空白,只需设置texture2d0。我从阅读苹果的文档中推测,2d1是用来混合/组合/修改纹理的。因为GLKit“只是”坐在着色器上,而且每个着色器都有一对纹理插槽--“传入”槽表示材料上已经出现的东西,而“修改”槽则表示着色器将用作参数来改进材质。

但这似乎行不通。

我试过:

代码语言:javascript
复制
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];

...and我所得到的只是一个黑色的非纹理。无论是纹理,放在0中(1中没有任何纹理),效果都很好。第二个纹理是阴影阿尔法到白色,其中第一个纹理都是不透明的,但与相当丰富的苍白。

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

  1. 加载基本纹理
  2. 加载第二纹理
  3. 加载一个混合掩膜,混合在它们之间。
  4. ...update混合面具帧一帧.而不必重新上传前两个纹理

注:我不想扔掉GLKit和写自定义着色器,而不是这样。我想了解GLKit是如何工作的--从外观上看,对于这样简单的事情,维护起来应该比我编写一堆着色器要容易得多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-05 22:57:24

如文件所述GLKTextureEnvModeModulate将纹理的颜色值相乘,这可能就是你看到黑色的原因。如果您想要将一个纹理与alpha覆盖在没有纹理的顶部,则使用GLKTextureEnvAttribDecal代替。

我看不出有什么方法可以只使用GLKit API来实现动态混合掩码的想法,但是您不必完全抛弃它。试着做这样的事情:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10654319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档