Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 150
- uniform sampler2D tex;
- uniform sampler2D etex;
- uniform sampler2D stex;
- uniform sampler2D ntex;
- uniform vec3 lightPos;
- uniform vec3 eyePos;
- uniform float roughness;
- in vec2 v_texcoord;
- in vec3 v_normal;
- in vec3 v_tangent;
- in vec3 v_objPos;
- in vec3 v_worldPos;
- in mat4 v_worldMatrix;
- out vec4 color;
- void main(){
- vec3 N = normalize(v_normal);
- vec4 q = texture(ntex, v_texcoord);
- q = (q - (1/2.0)) * 2.0;
- vec3 T = normalize(v_tangent);
- vec3 B = cross(N,T);
- mat3 Q = mat3(T.x, B.x, N.x, T.y, B.y, N.y, T.z, B.z, N.z);
- vec3 newNormal = q.rgb * Q;
- newNormal = normalize(newNormal);
- newNormal = (vec4(newNormal,0) * v_worldMatrix).xyz;
- vec3 L = normalize(lightPos - v_worldPos);
- vec3 V = normalize(eyePos - v_worldPos);
- vec3 R = reflect( -L,newNormal);
- float diffuse = clamp( dot(newNormal,L), 0.0, 1.0 );
- float dp = clamp( dot(L,N) , 0.0, 1.0);
- //float specular = pow( max( 0.0, dot(V,R)) , 32.0 ); //hardcoded exponent
- //specular *= sign(diffuse); //no specular if no diffuse
- //Cook-Torrance Specular:
- vec3 specmtl = texture(stex, v_texcoord).rgb;
- vec3 specular;
- float r = roughness;
- vec3 one = vec3(1.0);
- vec3 H = normalize(0.5*(L+V));
- vec3 sp = min( specmtl, vec3(0.95));
- vec3 sqrtk = sqrt(sp);
- vec3 n = (-one - sqrtk) / (sqrtk - one);
- vec3 cos_a = vec3(dot(N,V));
- vec3 cos_b = vec3(dot(N,L));
- vec3 cos_c = vec3(dot(V,H));
- vec3 cos_d = vec3(dot(N,H));
- vec3 q2 = sqrt(cos_c*cos_c - one + n*n);
- vec3 f1 = q2 - cos_c;
- vec3 f2 = q2 + cos_c;
- vec3 f3 = (f2 * cos_c)-one;
- vec3 f4 = (f1 * cos_c)+one;
- vec3 Q1 = f1/f2;
- Q1*=Q1;
- vec3 Q2 = f3/f4;
- Q2*=Q2;
- vec3 F=vec3(0.5)*Q1*(vec3(1.0)+Q2);
- float cos2d = cos_d[0]*cos_d[0];
- float t = r*(1.0-1.0/cos2d);
- float M;
- float rt = r;
- float rb = rt*0.5;
- //0,0,0 = center of object. Could change (have as
- //a uniform).
- vec3 objPos = vec3(0.0, 0.0, 0.0);
- vec3 v = normalize(v_objPos - vec3(0,0,0));
- float c = dot(v,vec3(0.0,0.0,-1.0));
- float s = sqrt(1.0-c);
- vec3 TT = vec3(c, 0.0 ,sign(v_objPos.z)*s);
- vec3 H_ = normalize( H + -dot(N,H)*N );
- float cos_g = dot(T,H_);
- float cos2g = cos_g * cos_g;
- float tt = (rt*rt*cos2g + rb*rb*(1.0-cos2g))*(1.0 - 1.0/cos2d);
- M = (rt * rb * exp(t)) / (4.0*cos2d*cos2d);
- //M = r*exp(t)/(4.0*cos2d*cos2d);
- float A = clamp(2.0*cos_d[0]*min(cos_a[0], cos_b[0])/cos_c[0], 0.0, 1.0);
- specular = vec3(M)*F*vec3(A)/(cos_a*cos_b*vec3(3.14159265358979323));
- specular *= sign(dp);
- //color.rgb = newNormal;
- color = texture(tex,v_texcoord);
- color.rgb *= diffuse;
- color.rgb += specular * texture(stex,v_texcoord).rgb;
- color.rgb += texture(etex,v_texcoord).rgb;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement