次のシェーダーを作成して、同心円の束でパターンを描画しました。最終的には、回転する各球体を発光体にして、these linesに沿って何かを作りたいと思っています。WebGLシェーダを最適化しますか?
もちろん、私はちょうど異なるオブジェクトをレンダリングするための最も基本的な部分をやっています。
残念ながら、シェーダは非常に遅いです(ハイエンドのMacBookではフルスクリーン16fps)。私はこれがシェイダーで持っている多数のforループと分岐に起因すると確信しています。私は道を最適化し、より高いパフォーマンスで実現しようとしているジオメトリをやってのけることができますどのように思ったんだけど:
EDIT:あなたがここにシェーダーを実行することができます:私は行方不明ですhttps://www.shadertoy.com/view/lssyRH
1つの明白な最適化は、ということです現在、すべてのフラグメントが周囲のサークル全体24に対してチェックされています。フラグメントがダイアグラムの外側の境界と交差するかどうかをチェックするだけで、これらのチェックを完全に破棄するのはかなり簡単で簡単です。私は、ベストプラクティスがこのようなことをやっていることをどのように扱っているかを把握しようとしていると思います。
#define N 10
#define M 5
#define K 24
#define M_PI 3.1415926535897932384626433832795
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
float aspectRatio = iResolution.x/iResolution.y;
float h = 1.0;
float w = aspectRatio;
vec2 uv = vec2(fragCoord.x/iResolution.x * aspectRatio, fragCoord.y/iResolution.y);
float radius = 0.01;
float orbitR = 0.02;
float orbiterRadius = 0.005;
float centerRadius = 0.002;
float encloseR = 2.0 * orbitR;
float encloserRadius = 0.002;
float spacingX = (w/(float(N) + 1.0));
float spacingY = h/(float(M) + 1.0);
float x = 0.0;
float y = 0.0;
vec4 totalLight = vec4(0.0, 0.0, 0.0, 1.0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// compute the center of the diagram
vec2 center = vec2(spacingX * (float(i) + 1.0), spacingY * (float(j) + 1.0));
x = center.x + orbitR * cos(iGlobalTime);
y = center.y + orbitR * sin(iGlobalTime);
vec2 bulb = vec2(x,y);
if (length(uv - center) < centerRadius) {
// frag intersects white center marker
fragColor = vec4(1.0);
return;
} else if (length(uv - bulb) < radius) {
// intersects rotating "light"
fragColor = vec4(uv,0.5+0.5*sin(iGlobalTime),1.0);
return;
} else {
// intersects one of the enclosing 24 cylinders
for(int k = 0; k < K; k++) {
float theta = M_PI * 2.0 * float(k)/ float(K);
x = center.x + cos(theta) * encloseR;
y = center.y + sin(theta) * encloseR;
vec2 encloser = vec2(x,y);
if (length(uv - encloser) < encloserRadius) {
fragColor = vec4(uv,0.5+0.5*sin(iGlobalTime),1.0);
return;
}
}
}
}
}
}
あなたは(罪のそれらの無数を事前に計算することができます)とCOS()、代わりに、シェーダ内でそれらを計算するシェーダに何とかそれらを送信これは、60fpsの時に実行するようになりましたか? – Ripi2
あなたのシェーダはうまく動作しません。少なくとも私にはアーティファクトがたくさんあります。そして、あなたには未使用の変数がたくさんあります。 –