3

OGLES1.1を変換しようとしています。GLKitへのコード。GLKitは、テクスチャスロットのペアを提供します。

  1. texture2d0
  2. texture2d1

各テクスチャにはenvモードがあります。

  1. GLKTextureEnvModeReplace、
  2. GLKTextureEnvModeModulate、
  3. GLKTextureEnvModeDecal

通常、texture2d1は空白のままにして、texture2d0を設定するだけです。私は、Appleのドキュメントを読んだことから、2d1はテクスチャのブレンド/結合/変更用であると想定しました。GLKitは「単に」シェーダーの上に配置されているため、各シェーダーには1対のテクスチャスロットが標準です。「着信」スロットは既にマテリアル上にあるものを表し、「変更」スロットはシェーダーが持つものを表します。マテリアルを変更するためのパラメータとして使用します。

しかし、それはうまくいかないようです。

私は試した:

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には何もない)どちらのテクスチャも正常に機能します。2番目のテクスチャはアルファから白にシェーディングされ、最初のテクスチャはすべて不透明ですが、かなりリッチなパレットがあります。

私が本当にやりたいのは、動的に生成/更新されたブレンドを効率的に適用し始めることです。例えば:

  1. ベーステクスチャをロードする
  2. 2番目のテクスチャをロードします
  3. それらの間でブレンドするブレンドマスクをロードします
  4. ...ブレンドマスクをフレームごとに更新します。最初の2つのテクスチャを再アップロードする必要はありません

注意:GLKitを捨てて、代わりにカスタムシェーダーを作成するつもりはありません。GLKitがどのように機能するかを理解したいのですが、見た目からすると、シェーダーをたくさん書いている場合よりも、このような単純なものの方がはるかに簡単に保守できるはずです。

4

1 に答える 1

0

ドキュメントに記載されているようにGLKTextureEnvModeModulate、テクスチャのカラー値を乗算します。これが、おそらく黒が表示されている理由です。なしのテクスチャの上にアルファ付きのテクスチャをオーバーレイする場合は、GLKTextureEnvAttribDecal代わりにを使用します。

GLKit APIのみを使用して動的ブレンドマスクのアイデアを実行する方法はわかりませんが、完全に捨てる必要はありません。次のようなものを試してください。

  1. ベーステクスチャ、2番目のテクスチャ、およびブレンディングマスクの3つのテクスチャオブジェクトをロードします。
  2. カラーアタッチメントが4番目のテクスチャであるフレームバッファオブジェクトを作成します。
  3. 2番目のテクスチャのRGB値とブレンディングマスクのアルファ値で塗りつぶすシェーダーを使用して、テクスチャFBOにレンダリングします。
  4. ベーステクスチャをとして使用しtexture0、FBOテクスチャをtexture1と同様に使用しGLKBaseEffectて、メインシーンを画面にレンダリングします。
  5. ブレンディングマスクを更新するときは、手順3〜4を繰り返します。

1回のレンダリングパスですべてを実行するフラグメントシェーダーよりも効率が悪い可能性がありますが、機能するはずです。

于 2013-09-05T22:57:24.010 に答える