- Geometry Pass
Depth(xy), Normal(xy) Geometry Buffer(이하 G-Buffer) 저장 - Light Properties Pass
아래 최종 색상 식에 미리 계산된 항목을 Light Buffer(이하 L-Buffer)
최종 색상 = Ambient + Shadow * Att * (N.L * diffuseColor * diffuseIntensity * diffuseLightColor + R.V^n * specularColor * specularIntensity * specularLightColor )
Light Properties
- N.L
- LightColor (Diffuse, Specular)
- R.V^n
- Attenuation
Light Texture(A8R8G8B8 format)
- Channel 1 : diffuseLightColor.r * N.L * Att
- Channel 2 : diffuseLightColor.g * N.L * Att
- Channel 3 : diffuseLightColor.b * N.L * Att
- Channel 4 : R.V^n * N.L *Att
아래는 관련 Shader Code 입니다.half4 ps_main( PS_INPUT Input ) : COLOR
{
half4 G_Buffer = tex2D( G_Buffer, Input.texCoord );// Compute pixel position
half Depth = UnpackFloat16( G_Buffer.zw );
float3 PixelPos = normalize(Input.EyeScreenRay.xyz) * Depth;// Compute normal
half3 Normal;
Normal.xy = G_Buffer.xy*2-1;
Normal.z = -sqrt(1-dot(Normal.xy,Normal.xy));// Computes light attenuation and direction
float3 LightDir = (Input.LightPos – PixelPos)*InvSqrLightRange;
half Attenuation = saturate(1-dot(LightDir / LightAttenuation_0, LightDir / LightAttenuation_0));
LightDir = normalize(LightDir);// R.V == Phong
float specular = pow(saturate(dot(reflect(normalize(-float3(0.0, 1.0, 0.0)), Normal), LightDir)), SpecularPower_0);float NL = dot(LightDir, Normal)*Attenuation;
return float4(DiffuseLightColor_0.x*NL, DiffuseLightColor_0.y*NL, DiffuseLightColor_0.z*NL, specular * NL);
} - Geometry-2 Pass
G-Buffer와 L-Buffer에 값을 가지고 최종 색상을 계산
아래는 관련 Shader Code입니다.float4 ps_main( PS_INPUT Input ) : COLOR0
{
float4 Light = tex2D( Light_Buffer, Input.texCoord );
float3 NLATTColor = float3(Light.x, Light.y, Light.z);
float3 Lighting = NLATTColor + Light.www;return float4(Lighting, 1.0f);
} - Forward Rendering
Translucency Objects Rendering(back to front)
원본으로 이동 소요유 (2002-09-26 09:02:19) 흠~ 그 동네에서도 나오는 모양이군요. 입체각을 이해하기 위해서는 빛을 예로드는 것이 편리합니다. 랜턴을 안개낀 날 밤에 비추면 빛의 세기는 거리에 따라 제곱분에 일로 감소합니다. 그러나 그 렌턴으로부터 나온 빛이 일정거리에서 차지하는 면적은 거리의 제곱에 비례하여 넓어집니다. 이때 변하지 않는 양은 (빛의 흡수가 없다면) 빛의 총에너지량과 또하나가 랜턴에서 나오는 빛이 만드는 원뿔의 각도입니다. 즉 이 빛원뿔을 따라가다 보면 거리에 따라 퍼지는 정도, 즉 단위면적당 빛의 에너지는 거리의 제곱에 반비레하지만, 이 빛이 통과하는 표면의 넓이는 거리의 제곱에 비례하여 커집니다. 소요유 (2002-09-26 09:07:51) 따라서 빛과 같이 직진성을 갖는 양의 3차원적인 '방사'는 이 빛원뿔 내부의 각도로 나타내면 편리하게 됩니다. 이 '원뿔'의 각도를 입체각으로 정의하게됩니다. 입체각은 위에 설명하였듯이 거리에 따라 변하지 않는 양으로 정의하게 됩니다. 즉 차원이 없는 양이됩니다. 입체각= (어느거리에서의 면적)/(거리의 제곱). 소요유 (2002-09-26 09:09:43) 반지름이 R인 구의 표면의 면적은 4 pi R^2이되므로 구의 입체각 = 4 pi R^2 / R^2 = 4 pi (steradian) 이 됩니다. 천칠이 (2002-09-26 09:31:02) 간혹 기존의 개념과 비교해서 생각하면 도움이 되는 경우도 있죠. 평면각을 생각해보시기 바랍니다. 원에서 부채꼴을 하나 조각내서 떼어왔다고 보면 그 중심각이 우리가 부르는 평면각과 마찬가지이죠. 이 평면각은 호의 길이에 비례하므로 우리가 라디안이라고 부르는 단위가 쓰입니다. 입체각은 말그대로 이것을 입체로 확대시킨 개념입니다. 구에서 "원뿔" 모양을 잘라냈다고 봤을 때 그 중심의 "입체각"은 곧 구면 원뿔...
댓글
댓글 쓰기