フォグ

attribute vec3 position; attribute vec3 normal; attribute vec2 texcoord; uniform vec3 light0_Direction; uniform mat4 normalMatrix; uniform mat4 modelViewMatrix; uniform mat4 modelViewMatrixInverse; uniform mat4 modelViewProjectionMatrix; varying vec2 fragTexCoord; varying vec3 fragEye; varying vec3 fragNormal; varying vec3 fragNormal2; varying vec3 fragLight; void main() { vec4 eye = vec4(modelViewMatrixInverse * vec4(0.0, 0.0, 0.0, 1.0)); fragEye = position - eye.xyz; //fragEye = -(modelViewMatrix * vec4(position, 0.0)).xyz; fragLight = light0_Direction; fragNormal = normal; fragNormal2 = (normalMatrix * vec4(normal, 0.0)).xyz; fragTexCoord = vec2(texcoord.x, 1.0 - texcoord.y); gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); } #ifdef GL_ES precision highp float; #endif uniform float time; uniform float eta; uniform float bias; uniform float scale; uniform float power; uniform float specpower; uniform sampler2D tex; uniform samplerCube cube; uniform sampler2D bump; varying vec2 fragTexCoord; varying vec3 fragEye; varying vec3 fragNormal; varying vec3 fragNormal2; varying vec3 fragLight; //バンプマッピング vec3 getBumpNrm(vec2 pnt) { const float SQ = 1.41421356; const float PI = 3.14159265; const float ca = 33.333; const float cb = 0.0; //vec2 cp0 = vec2(0,0); vec2 cp0 = vec2(-0.85, -0.8); float ca0 = 3.3 * ca; vec2 cp1 = vec2(0.7, -0.9); float ca1 = 0.8 * ca; vec2 cp2 = vec2(-0.9, 0.8); float ca2 = 0.7 * ca; vec2 cp3 = vec2(0.3, 0.5); float ca3 = 1.7 * ca; vec2 cp4 = vec2(0.85, 0.85); float ca4 = 4.5 * ca; vec2 po = (pnt - vec2(0.5)) * 2.0; float t = time * 4.0; float z; //波源0 vec2 p0 = po-cp0; vec2 q0 = normalize(p0); float m0 = mod(length(p0), 2.0) * ca0 - t; z = cos(m0 * PI); float a0 = (z + 1.0) / 2.0; z = sin(m0 * PI); float b0 = sign(z); vec3 c0 = vec3(b0 * q0.x, a0, b0 * q0.y); //波源1 vec2 p1 = po - cp1; vec2 q1 = normalize(p1); float m1 = mod(length(p1), 2.0) * ca1 - t; z = cos(m1 * PI); float a1 = (z + 1.0) / 2.0; z = sin(m1 * PI); float b1 = sign(z); vec3 c1 = vec3(b1 * q1.x, a1, b1 * q1.y); //波源2 vec2 p2 = po - cp2; vec2 q2 = normalize(p2); float m2 = mod(length(p2), 2.0) * ca2 - t; z = cos(m2 * PI); float a2 = (z + 1.0) / 2.0; z = sin(m2 * PI); float b2 = sign(z); vec3 c2 = vec3(b2 * q2.x, a2, b2 * q2.y); //波源3 vec2 p3 = po - cp3; vec2 q3 = normalize(p3); float m3 = mod(length(p3), 2.0) * ca3 - t; z = cos(m3 * PI); float a3 = (z + 1.0) / 2.0; z = sin(m3 * PI); float b3 = sign(z); vec3 c3 = vec3(b3 * q3.x, a3, b3 * q3.y); //波源4 vec2 p4 = po - cp4; vec2 q4 = normalize(p4); float m4 = mod(length(p4), 2.0) * ca4 - t; z = cos(m4 * PI); float a4 = (z + 1.0) / 2.0; z = sin(m4 * PI); float b4 = sign(z); vec3 c4 = vec3(b4 * q4.x, a4, b4 * q4.y); //統合 //return vec3(c0); return vec3((c0 + c1 + c2 + c3 + c4) / 5.0); } void main() { //const float center = 1.41421356; const float center = 3.0; vec3 eye = normalize(vec3(fragEye.x, fragEye.y, -fragEye.z)); //バンプマッピング const float ddd = 1.0; vec2 pnt = fragTexCoord; vec3 b0 = getBumpNrm(pnt); pnt = pnt - ddd; vec3 b1 = getBumpNrm(pnt); pnt.x = pnt.x + 2.0 * ddd; vec3 b2 = getBumpNrm(pnt); pnt.y = pnt.y + 2.0 * ddd; vec3 b3 = getBumpNrm(pnt); pnt.x = pnt.x - 2.0 * ddd; vec3 b4 = getBumpNrm(pnt); //vec3 bumpNrm = b0; vec3 bumpNrm = (b0 * center + b1 + b2 + b3 + b4) / (4.0 + center); vec3 tsn = bumpNrm; vec3 ssn = bumpNrm; vec3 dsn = bumpNrm; tsn.y = tsn.y * 64.0; ssn.y = (ssn.y - 0.5) * 4.0; dsn.y = (dsn.y - 0.5) * 4.0; tsn = normalize(tsn); ssn = normalize(ssn); dsn = normalize(dsn); //フレネル反射 //入射,反射,屈折ベクトルの計算 vec3 N = tsn; //法線ベクトル //vec3 N = vec3(0.0,1.0,0.0);//法線ベクトル vec3 I = eye; //入射ベクトル vec3 R = reflect(I, N); //反射ベクトル vec3 T = refract(I, N, eta); //屈折ベクトル //反射因数の計算 float fresnel = bias + scale * pow(1.0 - abs(dot(I, N)), power); //float fresnel = bias + scale * pow(1.0 - max(0.0, dot(I, N)), power); //反射環境色の取得 vec4 reflecColor = textureCube(cube, R); reflecColor = reflecColor * vec4(1.333); reflecColor.a = 1.0; //屈折環境色の計算 vec4 refracColor; refracColor = textureCube(cube, T); refracColor.a = 1.0; //ディフューズ反射 //スペキュラー反射 vec3 IS = normalize((normalize(fragLight) + eye) / 2.0); //入射ベクトル vec3 ID = normalize(fragLight); //入射ベクトル vec3 NS = ssn; //法線ベクトル vec3 ND = dsn; //法線ベクトル float spec = pow(max(0.0, dot(-IS, NS)), specpower); float diff = max(0.0, dot(-ID, ND)); vec3 col = diff * vec3(0.3, 0.3, 0.6); col += spec * vec3(1.0); vec4 lgtCol = vec4(col, 1.0); //色を統合 vec4 cubeCol = mix(refracColor, reflecColor, fresnel); cubeCol.a = fresnel * 0.5 + 0.5; //cubeCol = clamp(cubeCol, 0.0, 1.0); //cubeCol = cubeCol * vec4(0.2, 0.4, 0.8, 1.0); //gl_FragColor = vec4(normalize((bumpNrm * 0.5) + 0.5), 1.0); //gl_FragColor = cubeCol; //gl_FragColor = reflecColor; //gl_FragColor = refracColor; //gl_FragColor = lgtCol; gl_FragColor = mix(cubeCol, lgtCol, 0.4); }





テンキー + a,w,d,x,f,cキーで移動

 






戻る