2009-12-15 48 views
3

我正在尋找渲染2D紋理四邊形,每個像素的法線的最簡單,最簡單快捷的方法。 我的意思是一個3D世界,相機被固定,所有紋理四邊形都朝向相同的方向(相機),它們之間會有光點,我希望紋理具有每像素正常值所以他們會像3D模型一樣點亮。我在網上找到2D與每個像素的光照/法線貼圖渲染 - DirectX的

大多數技術都太複雜和沉重的原因,他們是指真正的3D模型,而所有我需要的是簡單的2D四邊形。

沒有人知道一個合適的技術或可以發佈一個有用的教程嗎? 哦,而DX只有請求。

謝謝。

+1

「真實」3D模型僅由一堆2D多邊形組成。 – 2009-12-15 21:03:10

+0

請注意,如果您使用旋轉(用於平鋪目的),則需要根據法線變換處理它。 – Stringer 2009-12-15 22:11:31

+0

「」真正的「3D模型只是由一堆2D多邊形組成的。」 - 的確如此,但是在處理「真實」3D模型時,您也正在處理3D空間中的旋轉,這使得所有事情都變得更加複雜(並且由於我發現的技術旨在解決這個問題,所以它們太複雜,殺死我的需求)。 另外,請注意恰好在3D空間中的平面四邊形和由幾十個(如果不是更多)多邊形在3D空間中散佈的網格組成的網格,而每個多邊形法線都是多邊形因子的因子,法線圖 - 這是另一種併發症 – rubi 2009-12-15 21:35:46

回答

3

我更有經驗與XNA而非DirectX的,但原理是一樣的。

你需要一個法線貼圖,這會告訴你的shader正是表面法線是在給定的點。然後你需要你的四邊形紋理貼圖(他們可能已經是,所以這不是任何額外的工作)。然後,你畫的四邊形與像素着色器,着色器裏面,你做這樣的事情:

//This shader only handles one directional light, there are various tecnhiques for handling multiple lights. 
float3 LightDirection; 

//Normal map, set this before rendering the quad 
Texture NormalMap; 
//sampler 
sampler normalSampler = sampler_state 
{ 
    texture = <NormalMap>; 
} 

//Diffusemap, set this before rendering the quad. This is just your normal texture you want applied to the quad 
Texture DiffuseMap; 
//sampler 
sampler diffuseSampler = sampler_state 
{ 
    texture = <DiffuseMap>; 
} 

/* you probably need a vertex shader to run all your translations etc, that's pretty bog standard stuff so I won't include one here */ 

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0 
{ 
    //standard directional lighting equation with normals 
    float3 Normal = tex2D(normalSampler, texCoord); 
    float dot = dot(LightDirection, Normal); 
    return tex2D(normalSampler, texCoord) * dot; 
} 
+0

我向您的帖子提交了一些修改,但否則這是正確的。 OP應該接受這個答案。 – eodabash 2011-04-02 19:53:22

+0

非常感謝eodabash。一個接受的答案會很好,但我不完全屏住呼吸兩年:( – Martin 2011-04-03 04:22:53

0

那麼你甚至不需要形成正切基礎,這使得它很容易的話。假設,定向照明,如果您將光線轉換到視野空間,那麼您可以直接從法線貼圖中將光線(L)與法線(N)對準。通過簡單地將它與視圖矩陣相乘,就可以將光矢量轉換爲視圖空間。

如果你想要點光源,這有點複雜。你需要首先將你的光照位置轉換到視圖空間。然後,你需要從你的像素位置減去你的光的位置,規範所產生的載體和使用你方信用證載體在N.L計算:)

無論哪種,方法...完成任務! :D