1

色の値をテストして、0.5 より大きい場合は変更しようとしています。

私はコンパイルされなかったこのテストから始めました:

    if(colourIn.b > 0.5){
       colourIn.b=0.0;
    }

ここの投稿を読んだところ、関係演算子がスカラー整数およびスカラー浮動小数点式でのみ機能することを説明するこの投稿を見つけました。

そのため、フラグ値を効率的にテストし、組み込み関数を使用する良い方法を見つけた後、次のように変更しました。

    float mixValue = clamp(ceil(colourIn.b * 2.0) - 1.0, 0.0, 1.0);

    if(greaterThan(colourIn.b,0.5)){
       colourIn.b = mix(colourIn.b, 0.0, mixValue);}

残念ながら、まだコンパイルされません。次のエラーが発生します。

    ERROR: 0:15 error(202) No matching overloaded function found greaterThan
    ERROR: 0:16 error(164) 1-value required assigned "colourIn" (can't modify an input)
    ERROR: 0:15 error(179) Boolean expression expected

このために、greatThan関数が間違って使用されていることがわかりましたか? (同様の状況で例を見つけることができません) colorIn の値を変更できないということですか?

私は間違っているかもしれません...これを理解するのを手伝ってください。

基本的に、青の値が 0.5 より大きいピクセルを白 (0.0) に変更したいと考えています。

4

1 に答える 1

2

はい、関係演算子がスカラーでのみ機能するのは事実です...一体何colourInを ( ) として宣言しbvecますか? ブール値の色があまり意味をなさないことを考慮すると、通常はor型colourIn.bのスカラー コンポーネントになります。コンパイルしようとしているシェーダーの実際の本体を含めてください。vecNivecN

さらに、greaterThan (...)スカラー型では機能せず、ベクトルのみが機能します。返されるのは、v1 と v2 の各コンポーネントのテスト v1 > v2 の結果を含むブール ベクトルです。

たとえば、次の疑似コードを考えてみましょう。

vec3  v1 = vec3 (1,2,3);
vec3  v2 = vec3 (3,2,1);

bvec3 gt = greaterThan (v1, v2);

その場合、ブール値ベクトルgtは次の形式になります。

gt.x = false;
gt.y = false;
gt.z = true;

ただし、最大の問題は、入力値を変更しようとしているということです。これを行うことはできません。フラグメント シェーダーの入力は、ラスター化中に頂点変換 (頂点シェーダー、ジオメトリ シェーダー、テッセレーション シェーダー) の出力から補間され、読み取り専用になります。頂点シェーダー入力は頂点バッファーからのもので、読み取り専用でもあります。シェーダーが実行できる唯一のことは、パイプラインの次のステージの出力を計算することです。

フラグメント シェーダーでは、次の段階で最終的なピクセル出力のブレンドが行われます。頂点シェーダーでは、テッセレーション (GL4+) とプリミティブ アセンブリ (ジオメトリ シェーダー) とラスター化 (フラグメント シェーダー) になります。

于 2013-11-08T00:04:15.110 に答える