質問
シェーダーを使用して球上にたくさんの円を描画しようとしています。基本的なアログリスは次のようになります。
- フラグメント (テクスチャ座標を使用) から円の中心の位置までの距離を計算します (円の中心もテクスチャ座標で指定されます)。
- フレジェントから円の中心までの角度を計算します。
- 角度に基づいて、テクスチャ (360 ピクセルが含まれており、赤いチャネルが半径距離を指定します) にアクセスし、指定された角度の半径を取得します。
- フラグメントから円の中心までの距離が取得した半径より小さい場合、フラグメントの色は赤になり、それ以外の場合は青になります。
描きたいのですが...青い球の上に 60 個の赤い丸があるとします。y シェーダーを 1 つの円で機能させることができましたが、60 個を機能させるにはどうすればよいでしょうか?これまでに試したことは次のとおりです。
特定の角度の半径を指定するデータ テクスチャを渡しましたが、アーティファクトが忍び寄っていることに気付きました。これは、次を使用してデータ テクスチャから情報を取得しようとしたときの線形補間によるものだと思います。
float returnV = texture2D(angles, vec2(x, y)).r;
ここで、angle は特定の角度の半径を含むデータ テクスチャ (Sampler2D) であり、x = angle / 360.0 (角度は 0 ~ 360)、y = 0 ~ 60 (y は円の番号) です。
Uniform float radii[360] を渡そうとしましたが、動的インデックス付けでは radii にアクセスできません。この混乱さえ試してみました...
getArrayValue(int index) { if (index == 0) { return radii[0]; } else if (index == 1) { return radii[1]; }
等々 ...
テクスチャを作成し、そのテクスチャ上にすべての円を配置し、その円を含む球で青い球をマルチテクスチャすると機能しますが、ご想像のとおり、エイリアシングが非常に悪くなります。実質的にエイリアシングがないため、フラグメントの位置と円の位置に基づいて円を手続き的に生成するというアイデアが気に入っています。しかし、私は1つよりも鉱石をやるのですか?
THX!!!
~ボルト
解決
私は地形上で円を作るシェーダを持っています。これは、マウスの移動によって移動します。 多分あなたはインスピレーションを得る?
これはフラグメントプログラムです。それは、メインプログラムではありませんが、あなたはあなたのプログラムに追加することができます。 これを試して...
今のあなたは、ハードコードで、いくつかの均一なパラメータを与えることができます。
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);
}
他のヒント
ufukgun に、あなたはその逆で、あなたの行列をmultuiply場合IDを取得します。
あなた;
vec4 v = vec4(gl_ModelViewMatrix * gl_Vertex);
vertexCoord = vec3(gl_ModelViewMatrixInverse * v);
は、したがって
と等価ですvertexCoord = vec3(gl_Vertex);