透明に囲まれた黒い形のシートがあります。このテクスチャをGLKitで正常にロードし、GLKBaseEffectを使用して形状を長方形に描画できます。黒(つまり不透明)のピクセルの色を変更して、黄色の図形や青色の図形などを描画できるようにする方法はありますか?または、これを行うためにカスタムシェーダーが必要ですか?
2 に答える
個々のテクセルカラー値をチェックする必要があるため、カスタムシェーダー(使用することを強くお勧めします)が必要になるようですが、最初に試すべきいくつかの提案があります。
GLKVertexAttribColorを指す頂点属性配列の頂点ごとのデータとして色を渡すことができます。これにより、各頂点(そして最終的には面)の色を個別に設定できますが、それらがテクスチャに対してどこに並んでいるかを確認するのは困難です。
エフェクトで次のプロパティを有効にしてみてください。
effect.colorMaterialEnabled = YES;
ただし、どちらの場合も、テクセルが完全に黒の場合、色の変化は見られないと思います。
次のようなことをする必要があるので、カスタムシェーダーが間違いなく進むべき道だと思います。
highp vec4 finalColor;
highp vec4 textureColor = texture2D(uTexture, vTexel);
highp vec4 surfaceColor = uColor;
// If texel is non-transparent (check alpha channel)
if(textureColor.a > 0.001)
finalColor = surfaceColor;
else
finalColor = vec4(0.0, 0.0, 0.0, 0.0);
gl_FragColor = finalColor;
uで始まるものはすべて、シェーダーに渡される一様変数です。
完全にカラー化されたテクスチャを取得するには、次を使用します。
self.effect.texture2d0.envMode = GLKTextureEnvModeModulate;
これは、OpenGLに、テクスチャ内の色を取得し、基になるジオメトリの色を乗算するように指示します。次に、頂点カラーリングを使用して、きちんとしたフェードなどを取得できます。
注:乗算が正しく機能するように、テクスチャを黒から白(1、1、1、1)に変更する必要があります。
注:すでに設定しておく必要のあるその他の設定は次のとおりです。
self.effect.texture2d0.enabled = GL_TRUE;
self.effect.texture2d0.target = GLKTextureTarget2D;
self.effect.texture2d0.name = self.texture.name;
self.effect.colorMaterialEnabled = GL_TRUE;
注:(GLKTextureEnvModeDecal
デカールを適用する場合のように)色付きのジオメトリの上にテクスチャをブレンドして、テクスチャの透明な部分が下のジオメトリを表示するようにすることもできます。