Created
May 27, 2015 13:02
-
-
Save 0b5vr/ce0d29a43d1e9a980d86 to your computer and use it in GitHub Desktop.
GLSL Raymarching Basic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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