ウサギFPS
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);
}
テンキーで移動
戻る