[英]opengl - sub surface scatering - texture space diffustion
我對http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html示例16-5有疑問。 一個用於解開模型並執行漫反射照明的頂點程序
struct a2v {
float4 pos : POSITION;
float3 normal : NORMAL;
float2 texture : TEXCOORD0;
};
struct v2f {
float4 hpos : POSITION;
float2 texcoord : TEXCOORD0;
float4 col : COLOR0;
};
v2f main(a2v IN,
uniform float4x4 lightMatrix)
{
v2f OUT;
// convert texture coordinates to NDC position [-1, 1]
OUT.hpos.xy = IN.texture * 2 - 1;
OUT.hpos.z = 0.0;
OUT.hpos.w = 1.0;
// diffuse lighting
float3 N = normalize(mul((float3x3) lightMatrix, IN.normal));
float3 L = normalize(-mul(lightMatrix, IN.pos).xyz);
float diffuse = max(dot(N, L), 0);
OUT.col = diffuse;
OUT.texcoord = IN.texture;
return OUT;
}
ligthMatrix用於變換頂點位置(IN.pos)。 但是我不明白,為什么允許使用此變換矩陣來變換頂點法線(IN.normal)。 我認為法線將需要其他特殊的轉換矩陣。
(float3x3) lightMatrix
是一個3x3矩陣,基本上只編碼旋轉。 您需要4x4矩陣進行翻譯。
旋轉法線以使它們在場景空間中有意義(即,使其隨對象旋轉而旋轉),但是由於矩陣缺少平移分量,因此它們將保持與原始大小相同(如果對其進行了歸一化,則它們將保持規范化)。
但是我不明白,為什么允許使用此變換矩陣來變換頂點法線(IN.normal)。
這是捷徑。 僅在某些情況下有效的一種。
正確使用的矩陣是位置變換矩陣的逆/轉置。 但是,旋轉矩陣的轉置是它的逆 。 逆的逆是原始的。 因此,如果您知道您的位置矩陣僅包含旋轉(以及平移,我們將其忽略為法線),那么您可以按原樣使用矩陣。
這樣做的危險是,如果您忘記了做這個假設,然后開始決定對位置使用比例轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.