2

WebGLシーンにGUIのような要素がいくつかありますが、これらは真っ白に表示する必要があり、シーンの照明の影響を受けません。

テクスチャはHTML5キャンバス要素で、背景は真っ白です。

しかし、シーン内のキャンバスをテクスチャとしてレンダリングすると、照明の影響を受けてライトグレーになります。

このテクスチャをキャンバスと同じ色(プレーンホワイト)で正確に表示するにはどうすればよいですか?

答えはフラグメントシェーダーにあり、すでにしばらく遊んでいるのではないかと思います...はい、一度は無地の色になりましたが、他には何もありません。背景色の上にテキストを表示したいと思います。

ありがとう!

4

2 に答える 2

2

わかった!:D

フラグメントシェーダーにブール変数を追加しました。

uniform bool uNoLights;

そして、テクスチャピクセル情報のみを使用して、設定時に最終的な色を決定します。

if (uNoLights) {
    gl_FragColor =  texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
}  else {
    gl_FragColor =  lights * texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
}
于 2012-10-20T16:20:14.747 に答える
1

もう1つのオプションは、GUIとシーンに別々のプログラムを使用することです。

プログラム、さまざまなフラグメントシェーダー/シェーダーとはどういう意味ですか?

プログラムは、頂点シェーダーとフラグメントシェーダーを組み合わせたものです。gl.useProgramコードのどこかにある必要があります。gl.useProgramシーンの前とGUIの前で、2つの異なるプログラムをセットアップし、レンダリングループ内で実行することについて話しています。

これの利点は、プログラムを完全に分離でき、GUIでのシーンの無駄な時間にのみ必要なロジックを回避できることです。その逆も同様です。

(欠点は、プログラムの切り替え自体にコストがかかることです。この場合、条件付きのコストよりも高くなる可能性がありますが、単一のフレーム内でプログラムを切り替えるのはごく普通のことです。)

最終的には、どちらがユースケースのパフォーマンスを向上させるかを測定する必要があります。

于 2012-10-21T21:35:53.880 に答える