2

シェーダーを使用して球体にたくさんの円を描こうとしています。基本的なアルゴリズムは次のようになります。

  1. (テクスチャ座標を使用して) フラグメントから円の中心の位置までの距離を計算します (円の中心もテクスチャ座標で指定されます)。
  2. フレジェントから円の中心までの角度を計算します。
  3. 角度に基づいて、テクスチャ (360 ピクセルを含み、赤のチャネルが半径距離を指定する) にアクセスし、指定された角度の半径を取得します。
  4. フラグメントから円の中心までの距離が取得した半径よりも小さい場合、フラグメントの色は赤になり、それ以外の場合は青になります。

描きたいのですが... 青い球体に赤い円を60個描いてください。y シェーダーを 1 つの円で動作させましたが、60 を行うにはどうすればよいですか? これが私がこれまでに試したことです....

  1. 特定の角度の半径を指定するデータ テクスチャを渡しましたが、アーティファクトが忍び寄っていることに気付きました。これは、以下を使用してデータ テクスチャから情報を取得しようとしたときの線形補間によるものだと思います。

    float returnV = texture2D(angles, vec2(x, y)).r; 
    

    ここで、angles は特定の角度の半径を含むデータ テクスチャ (Sampler2D) であり、x = angle / 360.0 (角度は 0 ~ 360) および y = 0 ~ 60 (y は円の番号)

  2. Uniform float radii[360] を渡そうとしましたが、動的インデックスで半径にアクセスできません。私もこの混乱を試しました...

    getArrayValue(int index) {
      if (index == 0) {
        return radii[0];
      }
      else if (index == 1) {
        return radii[1];
      }
    

    等々 ...

テクスチャを作成し、そのテクスチャにすべての円を配置してから、青い球体を円を含む球体とマルチテクスチャリングすると機能しますが、ご想像のとおり、エイリアシングが非常に悪くなります。事実上エイリアシングがないため、フラグメントの位置と円の位置に基づいて円を手続き的に生成するというアイデアが気に入っています。しかし、私は私が1つ以上行うのですか?

どうも!!!

〜ボルト

4

2 に答える 2

1

地形に円を描くシェーダーがあります。マウスの動きで動きます。多分あなたはインスピレーションを得ますか?

これはフラグメントプログラムです。これはメイン プログラムではありませんが、プログラムに追加できます。これを試して...

今のところ、ハードコードでいくつかの統一パラメータを指定できます。

uniform float showCircle;
uniform float radius;
uniform vec4 mousePosition;

varying vec3 vertexCoord;

void calculateTerrainCircle(inout vec4 pixelColor)
{
 if(showCircle == 1)
 {  
    float xDist = vertexCoord.x - mousePosition.x;
    float yDist = vertexCoord.y - mousePosition.y;

    float dist = xDist * xDist + yDist * yDist;
    float radius2 = radius * radius;

    if (dist < radius2 * 1.44f && dist > radius2 * 0.64f)
    {
        vec4 temp = pixelColor;

        float diff;
        if (dist < radius2)
            diff = (radius2 - dist) / (0.36f * radius2);
        else
            diff = (dist - radius2) / (0.44f * radius2);

        pixelColor = vec4(1, 0, 0, 1.0) * (1 - diff) + pixelColor * diff;   

        pixelColor = mix(pixelColor, temp, diff);
    }               
}   
}

そして頂点シェーダーで次を追加します:

varying vec3 vertexCoord;

void main()
{
    gl_Position = ftransform();

    vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
    vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
}
于 2009-07-15T09:28:35.147 に答える
0

ufukgun、行列に逆行列を掛けると、アイデンティティが得られます。
君の;

vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);

したがって、

vertexCoord = vec3(gl_Vertex);
于 2009-11-27T15:35:07.393 に答える