https://docs.microsoft.com/en-us/previous-versions//ff729723(v=vs.85)?redirectedfrom=MSDN
μ λ΄μ©μ μ°Έκ³ νμ¬ μ 리ν λ΄μ©μ λλ€.
λ¨λ²νΌ μ‘°λͺ (lambertian lighting)μ μ μ©ν΄λ³΄μ.
λ¨λ²νΈ μ‘°λͺ μ λΉμΌλ‘λΆν°μ 거리μ κ΄κ³μμ΄ κ· μΌν κ°λλ₯Ό κ°μ§λ€. λΉμ΄ νλ©΄μ λΏμΌλ©΄ λ°μ¬λλ λΉμ μμ λΉμ΄ νλ©΄μ λ―ΈμΉλ μ μ¬κ°μ λ°λΌ κ³μ°λλ€.
κ°λμ κ³μ°μ λ¨μ λ΄μ μΌλ‘ κ³μ°λλ€.
μ΄λ² νν 리μΌμμ μ¬μ©λ λΉμ directional lightingμ΄λ€. νμμ²λΌ λ¬Όμ²΄κ° μ΄λμ μλ λΉμ΄ λΉμΆλ λ°©ν₯μ΄ λμΌνλ€κ³ 보며, κ°λ³ 물체μ λΉμΆλ λΉμ κ°λλ κ³ λ €νμ§ μλλ€.
λ€λ₯Έ μ’ λ₯μ λΉμΌλ‘λ μ€μμμ κ· μΌν λΉμ λ°μ°νλ point lightκ³Ό, λͺ¨λ 물체μ λμΌνκ² μ μ©νμ§ μλ spot lightμ΄ μλ€.
μ΄ νν 리μΌμλ λ κ°μ κ΄μμ΄ μλ€. νλλ μ μ μΌλ‘ μ μ‘면체μ μ, λ€μ λμ΄κ³ , λ€λ₯Έ νλλ μ μ‘면체 μ£Όμλ₯Ό λλ€.
μ‘°λͺ
μ μ
°μ΄λμ μν΄ κ³μ°λλ―λ‘ λ³μλ€μ μ μΈλ λ€μ λ°μΈλ©λμ΄μΌ νλ€. μ΄ μνμμλ κ΄μμ λ°©ν₯κ³Ό μμ κ°λ§ μμΌλ©΄ λλ€.
첫 λ²μ§Έ λΉμ νμμ΄κ³ κ³ μ λμ΄ μμΌλ©°, λ λ²μ§Έ λΉμ κΆ€λλ₯Ό λλ λΉ¨κ° λΉμ΄λ€.
// Setup our lighting parameters
XMFLOAT4 vLightDirs[2] =
{
XMFLOAT4( -0.577f, 0.577f, -0.577f, 1.0f ),
XMFLOAT4( 0.0f, 0.0f, -1.0f, 1.0f ),
};
XMFLOAT4 vLightColors[2] =
{
XMFLOAT4( 0.5f, 0.5f, 0.5f, 1.0f ),
XMFLOAT4( 0.5f, 0.0f, 0.0f, 1.0f )
};
λΉμ λ°©ν₯μ΄ νμ μ€μμ ννλλ‘ νμ νλ ¬μ μ μ©νλ€. XMVector3Transform ν¨μλ 벑ν°μ νλ ¬μ κ³±νλλ° μ¬μ©λλ€. μ΄μ νν 리μΌμμλ λ³ν νλ ¬λ§ μλ νλ ¬μ κ³±νλ€μ μ
°μ΄λλ‘ μ λ¬νμ¬ λ³νμ μννλ€.
κ·Έλ¬λ μ΄ κ²½μ°μλ λ¨μμ±μ μν΄ CPUμμ λΉμ λ³ννλ μμ
μ νλ€.
// Rotate the second light around the origin
XMMATRIX mRotate = XMMatrixRotationY( -2.0f * t );
XMVECTOR vLightDir = XMLoadFloat4( &vLightDirs[1] );
vLightDir = XMVector3Transform( vLightDir, mRotate );
XMStoreFloat4( &vLightDirs[1], vLightDir );
λΉμ λ°©ν₯κ³Ό μμμ λͺ¨λ νλ ¬μ²λΌ μ °μ΄λμ μ λ¬λλ€. κ΄λ ¨ λ³μκ° νΈμΆλμ΄ μ€μ λκ³ λ§€κ° λ³μκ° μ λ¬λλ€.
//
// Update matrix variables and lighting variables
//
ConstantBuffer cb1;
cb1.mWorld = XMMatrixTranspose( g_World );
cb1.mView = XMMatrixTranspose( g_View );
cb1.mProjection = XMMatrixTranspose( g_Projection );
cb1.vLightDir[0] = vLightDirs[0];
cb1.vLightDir[1] = vLightDirs[1];
cb1.vLightColor[0] = vLightColors[0];
cb1.vLightColor[1] = vLightColors[1];
cb1.vOutputColor = XMFLOAT4(0, 0, 0, 0);
g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb1, 0, 0 );
λΉκ³Ό λ
Έλ©μ λ΄μ νλ©΄ λΉμ ν¨κ³Ό(μμ)λ₯Ό κ³μ°ν μ μλ€.
μ΄ κ°μ λ²μλ₯Ό [0. 1]λ‘ λ³ννλ saturate ν¨μλ₯Ό ν΅ν΄ μ λ¬λλ€.
λ§μ§λ§μΌλ‘, λ κ°λ₯Ό ν©μ³ μ΅μ’
μμ΄ κ²°μ λλ€.
νλ©΄μ λ¨Έν°λ¦¬μΌμ κ³μ°μ ν¬ν¨λμ§ μλλ€κ³ κ°μ νμ¬ νλ©΄μ μ΅μ’ μ μΈ μκΉ = λΉμ μκΉμ΄λ€.
//
// Pixel Shader
//
float4 PS( PS_INPUT input) : SV_Target
{
float4 finalColor = 0;
//do NdotL lighting for 2 lights
for(int i=0; i<2; i++)
{
finalColor += saturate( dot( (float3)vLightDir[i],input.Norm) * vLightColor[i] );
}
return finalColor;
}
μΌλ¨ ν½μ Έ μ °μ΄λλ₯Ό ν΅κ³Όνλ©΄, ν½μ λ€μ λΉμ μν΄ λ³μ‘°λ κ²μ΄κ³ , νλΈ νλ©΄μ κ° λΉμ΄ λ―ΈμΉλ μν₯μ λ³Ό μ μλ€.