簡體   English   中英

opengl-次表面修飾-紋理空間擴散

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM