0

さて、三角形を使用して作成した非常に大きな正方形(グリッド)があり、高さマップを適用してバンプしました。今やろうとしているのは、グリッド線を取得することです。これを行う方法を考え出しましたが、これにより、フラグメントシェーダーのステートメントがxに対して33 ifになり、yに対してさらに33になります。私は今やっていることを使用して、それを少し異なる方法で(いくつかのGLSL関数を使用して)実装して、1つまたは2つのifステートメントだけを必要とすることができると言われました。これは私の現在のコードです(すべてが完成しているわけではありませんが、imが何をしているのかがわかります)。

#version 330

uniform sampler2D texture;

in vec2 texCoord;

layout (location=0) out vec4 fragColour;



void main(void) {

vec4 newColor;
vec2 line = texCoord * 32; // makes texCoords easier to number (as divided by 32 in the C++array)


if(line.x > 0 && line.x < 0.9)
{
    newColor = vec4(1.0,1.0,1.0,1.0);
}
else if(line.x > 1 && line.x < 1.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 2 && line.x < 2.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 3 && line.x < 3.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 4 && line.x < 4.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 5 && line.x < 5.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 6 && line.x < 6.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 7 && line.x < 7.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 8 && line.x < 8.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 9 && line.x < 9.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 10 && line.x < 10.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 11 && line.x < 11.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 12 && line.x < 12.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 13 && line.x < 13.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 14 && line.x < 14.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 15 && line.x < 15.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 16 && line.x < 16.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 17 && line.x < 17.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 18 && line.x < 18.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 19 && line.x < 19.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 20 && line.x < 20.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 21 && line.x < 21.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 22 && line.x < 22.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 23 && line.x < 23.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 24 && line.x < 24.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}

else
{
    newColor = vec4(0.0,0.0,0.0,1.0);
}

fragColour = newColor;
}
4

2 に答える 2

6

どうしても必要な場合を除いて、制御フロー(ユニフォーム以外のものに依存する)を使用しないでください(少なくとも、前回glslシェーダーを作成したときの標準的な推奨事項でした)。あなたの場合、制御フローは必要ありません。step、、、および乗算を使用してsmoothstepmix制御フローを回避します。

コードの「if/else」セグメントは、次のようなものを使用して実装できます(テストされていないコード)。

fragColor = mix(vec4(0.0, 0.0, 0.0, 0.0), vec4(1.0, 1.0, 1.0, 1.0), step(fract(line.x), 0.9));

または、テクスチャルックアップを使用します。ハードウェア(およびテクスチャサイズ)によっては、テクスチャルックアップは数値計算よりも高速な場合があります

「ステップ」を使用すると、アンチエイリアス処理されていないギザギザのエッジや、遠くのサーフェスにノイズ/モアレパターンが生成される可能性があることに注意してください。「OpenGLオレンジブック」(「OpenGLシェーディング言語」)には、その対処方法を説明するいくつかの例がありました。ただし、テクスチャルックアップを使用する方が簡単な場合があります。まず、「step」の代わりに「smoothstep」を使用してみてください。

または、代わりに、ソリッドレンダリングされたランドスケープの上にワイヤーフレームモードでランドスケープ全体を再描画することもできます。

于 2012-11-15T17:07:12.643 に答える
0

これは、投影テクスチャをスローするだけで簡単に実行できます。「投影」する必要すらありません。に基づいてテクスチャ座標を計算するだけlineです。実際、それらは非常にテクスチャ座標であるように見えます。したがって、内側が白で、外側が適切な幅の黒のテクスチャを作成するだけです。メモリを節約するためにシングルチャネルにすることもできます。

もちろん、S方向とT方向に繰り返すテクスチャが必要になります。

于 2012-11-15T17:28:21.380 に答える