본문 바로가기
기타 공부하기

PBR 슈도코드

by 대마왕J 2016. 4. 2.

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;
   }

 

프레넬에 오류가 좀 되어 있으니 수정필요.

그냥 백업용이니 뭐...

 

http://t-pot.com/PBR/

 

일단 담에 공부할때 쓸라고 백업

 

아니 쿡 토런스 코드라고 해야 하나...

 

반응형

댓글