63

私は最近、特に OpenGL と GLSL について詳しく学ぶために、Shadertoy ( https://www.shadertoy.com/ ) を調べています。

私がこれまでに理解していることから、OpenGL ユーザーはまず、使用するすべてのジオメトリを準備し、OpenGL サーバーを構成する必要があります (許可されるライトの数、テクスチャ ストレージなど)。それが完了したら、ユーザーは、OpenGL プログラムをコンパイルする前に、少なくとも 1 つの頂点シェーダー プログラムと 1 つのフラグメント シェーダー プログラムを提供する必要があります。

しかし、Shadertoy のコード サンプルを見ると、シェーダー プログラムは 1 つしかなく、使用されているジオメトリのほとんどは GLSL コードに直接書き込まれているようです。

それはどのように機能しますか?

私の推測では、頂点シェーダーは事前に準備されており、編集可能/サンプル シェーダーはフラグメント シェーダーにすぎません。しかし、それではいくつかのより複雑な例のジオメトリを説明できません...

Shadertoy の仕組みを説明できる人はいますか?

4

5 に答える 5

80

ShaderToy は、ピクセル シェーダーを作成するためのツールです。

ピクセル シェーダーとは

フル スクリーン クワッドをレンダリングする場合、つまり 4 つのポイントのそれぞれがビューポートの 4 つのコーナーの 1 つに配置される場合、そのクワッドのフラグメント シェーダーはピクセル シェーダーと呼ばれます。画面のピクセル。したがって、ピクセル シェーダーはフルスクリーン クワッドのフラグメント シェーダーです。

したがって、属性は常に同じであり、頂点シェーダーも同じです。

positions = [ [-1,1], [1,1], [-1,-1], [1,-1] ]
uv = [ [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0] ]

そして、そのクワッドは としてレンダリングされTRIANGLE_STRIPます。また、明示的に設定する代わりに、フラグメント シェーダーの組み込み変数 を使用して、たとえば a で分割するUVsことを好む人もいます。gl_FragCoorduniform vec2 uScreenResolution

頂点シェーダー:

attribute vec2 aPos;
attribute vec2 aUV;
varying vec2 vUV;

void main() {
    gl_Position = vec4(aPos, 0.0, 1.0);
    vUV = aUV;
}

フラグメント シェーダーは次のようになります。

uniform vec2 uScreenResolution;
varying vec2 vUV;

void main() {
    // vUV is equal to gl_FragCoord/uScreenResolution
    // do some pixel shader related work
    gl_FragColor = vec3(someColor);
}

ShaderToy は、ピクセル シェーダーで使用できるデフォルトのiResolution(aka uScreenResolution) 、、、、iGlobalTimeなどのいくつかのユニフォームを提供できます。iMouse

ジオメトリをフラグメント シェーダー (別名ピクセル シェーダー) に直接コーディングするために、開発者はレイ トレーシングと呼ばれるものを使用します。これはプログラミングの非常に複雑な領域ですが、簡単に言えば、いくつかの数式を使用してジオメトリを提示し、後でピクセル シェーダーで、一部のピクセルがジオメトリの一部であるかどうかを確認する場合は、その数式を使用してその情報を取得します。Google で少し調べてみると、レイ トレーサーが正確にどのようにどのように構築されているかを読み取るための十分なリソースが得られるはず です。

お役に立てれば。

于 2013-10-18T14:59:11.817 に答える
9

ShaderToy は、すべてのライティング、ジオメトリなどを処理するようにプログラムされたシンプルな GLSL を表示します。これは頂点ジオメトリではなく、ほとんどの 3D のものをレイキャストしているか、2D シェーダーなどを実行できます。

色と空間の計算は、GLSL 言語でプログラムできます。高度なアルゴリズムの組み合わせにより、等値面、形状が作成され、等値面にテクスチャが投影されます。レイキャスティングは、仮想線を視聴者から離れた場所に送信し、邪魔になるものをインターセプトします。3D には多くのレイキャスティング手法があります。

shadertoy /glsl グラフィックで使用されるさまざまなツールのアイデアについては、www.iquilezles.orgにアクセスしてください。

于 2014-02-16T15:25:01.673 に答える