Skip to content

Instantly share code, notes, and snippets.

@hanachiru
Last active Dec 3, 2020
Embed
What would you like to do?
/// <summary>
/// 1. はじめてのフラグメントシェーダー
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// (R, G, B, A) = (1, 0, 0, 1)を各ピクセルに対して代入する
// 例えば描画領域が 1280x720 個ある場合、1フレームで1280 x 720回この処理が呼ばれる
fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
/// <summary>
/// 2. 画面の正規化をする
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// iResolutionは画面の幅を表す2次元ベクトル
vec2 uv = fragCoord/iResolution.xy;
fragColor = vec4(uv, 0.0, 1.0);
}
/// <summary>
/// 3. 時間経過を取得する
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord/iResolution.xy;
// abs(sin(iTime)) => |sin(t)|
fragColor = vec4(uv.x, uv.y , abs(sin(iTime)), 1.0);
}
/// <summary>
/// 4. 経過時間を使った作品の練習
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord/iResolution.xy;
fragColor = vec4(abs(sin(uv.x + iTime)), 0 , 0, 1.0);
}
/// <summary>
/// 5. 経過時間を使った作品の練習 その2
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord/iResolution.xy;
float col = abs(sin((uv.x - iTime) * 40.0));
fragColor = vec4(col, col, col, 1);
}
/// <summary>
/// 6. Step関数を使った作品
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord/iResolution.xy;
float col = step(abs(sin((uv.x - iTime) * 40.0)), 0.5);
fragColor = vec4(col, col, col, 1);
}
/// <summary>
/// 7. 距離関数を使った作品
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// 左下(0,0) ~ 右上(1,1) になるように正規化
vec2 uv = fragCoord/iResolution.xy;
// 画面中央からの距離を求める
float d = distance(vec2(0.5, 0.5), uv);
// 距離を色として出力
fragColor = vec4(d, d, d, 1);
}
/// <summary>
/// 8. 今までの知識と距離関数を使った作品
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// 左下(0,0) ~ 右上(1,1) になるように正規化
vec2 uv = fragCoord/iResolution.xy;
// 画面中央からの距離を求める
float d = distance(vec2(0.5, 0.5), uv);
float edge = 0.3;
float color = step(edge, sin(d * 100.0 + iTime * 20.0));
// 距離を色として出力
fragColor = vec4(color, color, color, 1);
}
/// <summary>
/// ボロノイ図
/// </summary>
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord/iResolution.xy;
// 適当にランダムな母点を用意
vec2[5] points = vec2[](
vec2(0.14, 0.17),
vec2(0.83, abs(cos(iTime))),
vec2(abs(sin(iTime)), 0.23),
vec2(0.5 * cos(-iTime) + 0.5, 0.5 * sin(-iTime) + 0.5),
vec2(0.5 * cos(iTime) + 0.5, 0.5 * sin(iTime) + 0.5)
);
float m_dis = 1.0; // minimum distance
vec2 m_point; // minimum point
// 一番近い距離にある母点を調べる
for(int i = 0; i < 5; i++) {
float dis = distance(uv, points[i]);
if(dis < m_dis){
m_dis = min(dis, m_dis);
m_point = points[i];
}
}
// 求めた母点の座標の値をそのまま色として出力
fragColor = vec4(m_point, 0, 1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment