1

これで、openGL で作成したオブジェクトのコレクションができました。それぞれに独自の色があり、テクスチャが適用されているものもあります。私がやりたいのは、特定の色が画面に届かないようにすることですが、それでも変更できるようにすることです。どの色が実際にペイントされるかチェリーピックする方法はありますか?

カメラの前に半透明の平面を置いてみましたが、他の色が通過するのを止めることはできません。むしろ、それらとブレンドするだけです。

理想的には、次のように動作します。

赤い物体 + 赤いスクリーン = 赤い物体

青い物体 + 赤いスクリーン = グレー/黒/白の物体

紫色の物体 + 赤い画面 = 赤い物体

-編集-

これを実行しようとしていることを明確にするために、すべてのオブジェクトの RGB 値を同じままにしたいと考えています。ただし、画面にペイントする前に、オブジェクトに実際の変更を加えずに、色の値の一部を「ゼロ」にしたいと考えています。

したがって、RGB [255,150,200] を持つオブジェクトが赤のフィルターを通過すると、RGB 値 [255,0,0]、緑のフィルター [0,150,0]、青のフィルター [0,0,200] を持つオブジェクトとしてペイントされます。

4

2 に答える 2

1

glColorMask をお探しですか?

この回答を参照してください:他のチャネルに影響を与えずにカラー チャネルにレンダリングする

あなたの問題については明確ではありませんが、これにより、選択したカラーチャンネルがマスクアウト/マスクされます: R、G、B、または A


これを考えると

そのため、RGB [255,150,200] を持つオブジェクトが赤のフィルターを通過すると、RGB 値が [255,0,0]、緑のフィルターが [0,150,0]、青のフィルターが [0,0,200] であるかのようにペイントされます。

glColorMask が機能します。

glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
drawMyRedFilteredStuff();
// Return open gl state back to normal function
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

赤、緑、青、またはアルファのみでフィルタリングする必要がある場合、これはまさにあなたが探しているものです。

私はまだあなたがやろうとしていることを理解していませんか?

于 2012-11-30T03:45:19.377 に答える
0

これはフラグメントシェーダーで処理するのが最適だと思います。「フィルター」が定数値の場合、均一に設定できます。

uniform vec3 filter_rgb;
in vec3 src_rgb;

out vec4 dst_rgba;

void main (void)
{
    dst_rgba = vec4(min(filter_rgb, src_rgb), 1.0);
}

そのため、フィルタ コンポーネントのいずれかがゼロに設定されている場合、対応する出力コンポーネントもゼロになります。必要な動作に応じて、clamp関数は関数よりも組み込みのより便利な選択肢になる場合がありminます。

于 2012-11-30T11:12:01.857 に答える