Skip to content

Instantly share code, notes, and snippets.

@0b5vr
Created May 27, 2015 13:02
Show Gist options
  • Save 0b5vr/ce0d29a43d1e9a980d86 to your computer and use it in GitHub Desktop.
Save 0b5vr/ce0d29a43d1e9a980d86 to your computer and use it in GitHub Desktop.
GLSL Raymarching Basic
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 resolution;
float distFunc( vec3 p )
{
return length( p ) - 0.3; // 半径0.3の球体
}
vec3 distFuncNormal( vec3 p )
{
vec2 d = vec2( 0.0, 0.001 );
return normalize( vec3(
distFunc( p + d.yxx ) - distFunc( p - d.yxx ),
distFunc( p + d.xyx ) - distFunc( p - d.xyx ),
distFunc( p + d.xxy ) - distFunc( p - d.xxy )
) );
}
void main()
{
vec3 camPos = vec3( 0.0, 0.0, 1.0 ); // カメラ位置
vec3 camCen = vec3( 0.0, 0.0, 0.0 ); // カメラ目標
vec3 camDir = normalize( camCen - camPos ); // カメラ向き
vec3 camAir = vec3( 0.0, 1.0, 0.0 ); // カメラ天井
vec3 camSid = normalize( cross( camDir, camAir ) ); // カメラ右
vec3 camTop = normalize( cross( camSid, camDir ) ); // カメラ上
vec2 p = ( gl_FragCoord.xy * 2.0 - resolution.xy ) / resolution.x; // 画面中心を原点、画面右端を( 1, 0 )とした、アスペクト比が 1:1 の座標系上のピクセルの位置
vec3 rayDir = normalize( camSid * p.x + camTop * p.y + camDir ); // 光の向き
float rayLen = 0.0; // 光の長さ
vec3 rayPos = camPos + rayDir * rayLen; // 光の先端位置
float dist = 0.0;
for( int i=0; i<50; i++ )
{
dist = distFunc( rayPos ); // 光の先端位置から球体の表面までの距離を計算
rayLen += dist; // 光をdistだけ進ませる
rayPos = camPos + rayDir * rayLen; // 光の先端位置を再計算
}
if( dist < 0.01 ) // 最後に球体の表面までの距離を計算した時、距離が十分短ければ
{
vec3 nor = distFuncNormal( rayPos ); // 球体表面の法線を計算
float dif = dot( vec3( 0.5, 0.5, 0.5 ), nor ); // ライティング
gl_FragColor = vec4( vec3( dif ), 1.0 );
}
else
{
gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment