Physically Based Rendering

GLSLで物理ベースシェーディング

float3 color = (1-metallic) * diffuse + metallic * specular;

ということでよさそう。

Diffuse

正規化Lambert

https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/glTF-WebGL-PBR/shaders/pbr-frag.glsl

// Basic Lambertian diffuse
// Implementation from Lambert's Photometria https://archive.org/details/lambertsphotome00lambgoog
// See also [1], Equation 1
vec3 diffuse(PBRInfo pbrInputs)
{
    return pbrInputs.diffuseColor / M_PI;
}

// irradiance x BRDF
dot(S, N) * diffuse(pbrInputs);

という具合にに PI で割る。 正規化Lambert というらしい。

Albedo

ここで pbrInputs.diffuseColorcolor とちょっと違うので Albedo と名付けたぽい?

  • sRGB でなくて linear で扱う

  • PI で割ることをあらかじめ加味しておく

Specular: 鏡面反射モデル

GLSLによるフォンシェーディング

D

G

F