簡體   English   中英

GLKit混合兩種紋理

[英]GLKit blend two textures

我正在嘗試轉換OGL ES 1.1。 代碼到GLKit。 GLKit提供了一對紋理槽:

  1. texture2d0
  2. texture2d1

每個紋理都有一個env模式:

  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-to-white陰影,第一個紋理都是不透明的,但是有一個相當豐富的pallette。

我真正想做的是開始有效地應用動態生成/更新的混合。 例如:

  1. 加載基礎紋理
  2. 加載第二個紋理
  3. 加載在它們之間混合的混合蒙版
  4. ...逐幀更新混合蒙版。 無需重新上傳前兩個紋理

注意:我不打算扔掉GLKit並為此編寫自定義着色器。 我想了解GLKit是如何工作的 - 而且對於像這樣的簡單事物,它應該是很容易維護的東西,而不是我編寫一堆着色器。

如文檔中所述GLKTextureEnvModeModulate將紋理的顏色值相乘,這可能就是您看到黑色的原因。 如果要在紋理頂部覆蓋帶有alpha的紋理,請使用GLKTextureEnvAttribDecal

我沒有看到只使用GLKit API來實現動態混合蒙版構思的方法,但您不必完全拋棄它。 嘗試這樣的事情:

  1. 加載三個紋理對象:基礎紋理,第二個紋理和混合蒙版。
  2. 創建一個framebuffer對象,其顏色附件是第四個紋理。
  3. 使用着色器渲染到紋理FBO,該着色器使用來自第二個紋理的RGB值和來自混合蒙版的Alpha值填充它。
  4. 將基礎紋理用作texture0 ,將FBO紋理用作帶有GLKBaseEffect texture1 ,並將主場景渲染到屏幕。
  5. 更新混合蒙版時重復步驟3-4。

它可能比在一個渲染過程中完成所有操作的片段着色器效率低,但它應該有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM