![見出し画像](https://assets.st-note.com/production/uploads/images/83716634/rectangle_large_type_2_6825ebd058b1372c1902568d52427da4.png?width=1200)
🎡shadertoyからglslsandboxに移植するためのc言語マクロ テンプレソース付き
三大MHならぬ三大gsls書ける場所、しかし、互換性は低い
shadertoyのエントリポイントはmainImage
イメージシェーダは、mainImage()関数を実装し、各ピクセルの色を計算してプロシージャルイメージを生成します。この関数は、ピクセルごとに一度だけ呼び出されることが想定されており、ホストアプリケーションは、この関数に適切な入力を与え、出力された色を取得してスクリーンのピクセルに割り当てる責任があります。プロトタイプは以下の通りです。
void mainImage( out vec4 fragColor, in vec2 fragCoord );
ここで、fragCoord には、シェーダが色を計算する必要のあるピクセル座標が含まれています。座標はピクセル単位で、レンダリングサーフェス上の0.5からresolution-0.5までの範囲で、解像度はiResolutionユニフォーム(後述)を通してシェーダに渡されます。
結果の色は、4成分のベクトルとしてfragColorに集められますが、最後の成分はクライアントによって無視されます。結果は、将来的に複数のレンダリングターゲットを追加することを想定して、「out」変数として収集されます。
GLSLSANDBOXのエントリポイントはmainなので、defineしてユニフォーム関数を再定義、mainからmainImageを呼ぶようにしてコピペすれば、テクスチャとか使ってなければある程度は動きます。
#ifdef GL_ES
precision mediump float; #endif
// glslsandbox uniforms
uniform float time;
uniform vec2 resolution;
// shadertoy emulation #define iTime time #define iResolution vec3(resolution ,0.1)
// --------[ Original ShaderToy begins here ]---------- //
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
}
// --------[ Original ShaderToy ends here ]---------- //
void main(void)
{
mainImage(gl_FragColor, gl_FragCoord.xy);
gl_FragColor.a = 1.;
}
![](https://assets.st-note.com/img/1659226491961-7StM4EpjJH.png?width=1200)
![](https://assets.st-note.com/img/1659226786242-p22BaELOgM.png?width=1200)
![](https://assets.st-note.com/img/1662074457300-PDl6Ucp3dv.png)
お願い致します