8作目できました。
今回はレイマーチングによって描画した球にテクスチャ(画像)を貼り付ける、ということに挑戦しました。貼り付けた後、その球を回転させることもできました。これらはかなり応用が効くはず!
こちらが使用した画像です。
球という簡単な図形ならできましたね。あとは今まで学んだことを色々エフェクトとして試して完成しました。
引き続き制作を続けていきます。
コードも貼っておきますね。
#iChannel0 "sky01.png"
#define PI 3.14159265359
#define LIGHT_DIRECTION normalize(vec3(1.0, 1.0, -1.0))
mat2 rot(float angle)
{
return mat2(cos(angle), -sin(angle), sin(angle), cos(angle));
}
float sdSphere(vec3 p, float r) {
return length(p) - r;
}
float map(vec3 p) {
float d = sdSphere(p, .9);
return d;
}
//get normal
vec3 getNormal(vec3 p) {
vec2 e = vec2(0.001, 0.0);
return normalize(vec3(
map(p + e.xyy) - map(p - e.xyy),
map(p + e.yxy) - map(p - e.yxy),
map(p + e.yyx) - map(p - e.yyx)
));
}
//視線ベクトルと法線ベクトルの内積
vec3 getReflection(vec3 dir, vec3 normal) {
return vec3(clamp(dot(dir,normal),0.1,1.0));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy / iResolution.xy; //uv:0-1
vec3 textureSky = texture(iChannel0, uv).xyz; //texture:0-1
uv = uv * 2.0 - 1.0; //uv:-1-1
vec3 col = vec3(1.0);
//ノイズ
float noise = fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453);
textureSky.rgb += vec3(noise) * 0.15;
col = textureSky;
col *= .5 * clamp(pow(uv.y + 1.15, 1.),0.0,1.0);
col *= 1./pow(abs(uv.x), .25);
float u;
float v;
//レイマーチング
vec3 ro = vec3(0.0, 0.0, -3.0);
vec3 rd = normalize(vec3(uv, 1.0));
float t = 0.0;
for(int i = 0; i < 64; i++){
vec3 p = ro + rd * t;
float d = map(p);
if(d < 0.01) {
vec3 normal = getNormal(p);
vec3 reflectionColor = getReflection(LIGHT_DIRECTION, normal);
//球の表面上の座標を極座標(UV座標)に変換
u = 0.5 + atan(normal.z, normal.x) / (2.0 * PI);
v = 0.5 - asin(normal.y) / PI;
vec2 uvSphere = vec2(u,v);
uvSphere *= -1.;
uvSphere *= rot(iTime * .2);
vec3 textureSphere = texture(iChannel0, uvSphere).xyz;
col = textureSphere;
col *= reflectionColor;
col *= t * 0.5;
break;
}
t += d;
}
fragColor = vec4(col,1.0);
}
ではまた。
音楽:BGMer
http://bgmer.net
#デジタルアート #デモシーン #3DCG #シェーダーコーディング #レイマーチング #SF #demoscene
Please follow and like us:
コメント