precision mediump float;
uniform mat4 invMatrix;
uniform vec3 lightDirection;
uniform vec3 eyeDirection;
uniform vec4 parametes;
uniform sampler2D texture;
varying vec3 vNormal;
varying vec2 vTexCoord;
void main(void){
vec4 decale = texture2D(texture, vTexCoord);
// gamma coreect
decale.x = pow(decale.x, 2.2);
decale.y = pow(decale.y, 2.2);
decale.z = pow(decale.z, 2.2);
vec3 n = normalize(vNormal);
vec3 invLight = normalize(invMatrix * vec4(lightDirection, 0.0)).xyz;
vec3 invEye = normalize(invMatrix * vec4(eyeDirection, 0.0)).xyz;
vec3 halfLE = normalize(invLight + invEye);
float power = 80.0;
float roughness = parametes.z;
float alpha2 = roughness * roughness * roughness * roughness;;
float D = alpha2 / (3.141592 * pow(dot(n, halfLE) * dot(n, halfLE)*(alpha2 - 1.0) + 1.0, 2.0));
float fresnel = parametes.y + (1.0-parametes.y)*pow(clamp(dot(invEye, halfLE), 0.0, 1.0), 5.0);
float nv = clamp(dot(invEye, n), 0.0, 1.0);
float nl = clamp(dot(invLight, n), 0.0, 1.0);
float G = 1.0 / (nv + sqrt(alpha2 + (1.0 - alpha2) * nv * nv)) / (nl + sqrt(alpha2 + (1.0 - alpha2) * nl * nl));
float specular = D * fresnel * G;
float diffuse = (1.0 - fresnel) * clamp(dot(n, invLight), 0.0, 1.0) / 3.141592;
float metallic = parametes.w;
gl_FragColor.xyz = decale.xyz * mix(vec3(diffuse), vec3(specular), metallic);
gl_FragColor.w = 1.0;
}
프레넬에 오류가 좀 되어 있으니 수정필요.
그냥 백업용이니 뭐...
일단 담에 공부할때 쓸라고 백업
아니 쿡 토런스 코드라고 해야 하나...
'기타 공부하기' 카테고리의 다른 글
파티클 일루젼 윈 10 문제인가?!? (0) | 2016.09.14 |
---|---|
Understanding BCn Texture Compression Formats (0) | 2016.05.25 |
월드머신 으로 하이트맵 만들기 테스트 (0) | 2016.02.09 |
AUTODESK Stingray : 오토데스크 스팅레이 / 가오리엔진 첫인상 (0) | 2015.12.10 |
벡터 길이 공식 : X와 Y 만 가지고 Z를 구해보자 (0) | 2015.08.12 |
댓글