シェーダーを使用して球体にたくさんの円を描こうとしています。基本的なアルゴリズムは次のようになります。
- (テクスチャ座標を使用して) フラグメントから円の中心の位置までの距離を計算します (円の中心もテクスチャ座標で指定されます)。
- フレジェントから円の中心までの角度を計算します。
- 角度に基づいて、テクスチャ (360 ピクセルを含み、赤のチャネルが半径距離を指定する) にアクセスし、指定された角度の半径を取得します。
- フラグメントから円の中心までの距離が取得した半径よりも小さい場合、フラグメントの色は赤になり、それ以外の場合は青になります。
描きたいのですが... 青い球体に赤い円を60個描いてください。y シェーダーを 1 つの円で動作させましたが、60 を行うにはどうすればよいですか? これが私がこれまでに試したことです....
特定の角度の半径を指定するデータ テクスチャを渡しましたが、アーティファクトが忍び寄っていることに気付きました。これは、以下を使用してデータ テクスチャから情報を取得しようとしたときの線形補間によるものだと思います。
float returnV = texture2D(angles, vec2(x, y)).r;
ここで、angles は特定の角度の半径を含むデータ テクスチャ (Sampler2D) であり、x = angle / 360.0 (角度は 0 ~ 360) および y = 0 ~ 60 (y は円の番号)
Uniform float radii[360] を渡そうとしましたが、動的インデックスで半径にアクセスできません。私もこの混乱を試しました...
getArrayValue(int index) { if (index == 0) { return radii[0]; } else if (index == 1) { return radii[1]; }
等々 ...
テクスチャを作成し、そのテクスチャにすべての円を配置してから、青い球体を円を含む球体とマルチテクスチャリングすると機能しますが、ご想像のとおり、エイリアシングが非常に悪くなります。事実上エイリアシングがないため、フラグメントの位置と円の位置に基づいて円を手続き的に生成するというアイデアが気に入っています。しかし、私は私が1つ以上行うのですか?
どうも!!!
〜ボルト