我正在尋找渲染2D紋理四邊形,每個像素的法線的最簡單,最簡單快捷的方法。 我的意思是一個3D世界,相機被固定,所有紋理四邊形都朝向相同的方向(相機),它們之間會有光點,我希望紋理具有每像素正常值所以他們會像3D模型一樣點亮。我在網上找到2D與每個像素的光照/法線貼圖渲染 - DirectX的
大多數技術都太複雜和沉重的原因,他們是指真正的3D模型,而所有我需要的是簡單的2D四邊形。
沒有人知道一個合適的技術或可以發佈一個有用的教程嗎? 哦,而DX只有請求。
謝謝。
我正在尋找渲染2D紋理四邊形,每個像素的法線的最簡單,最簡單快捷的方法。 我的意思是一個3D世界,相機被固定,所有紋理四邊形都朝向相同的方向(相機),它們之間會有光點,我希望紋理具有每像素正常值所以他們會像3D模型一樣點亮。我在網上找到2D與每個像素的光照/法線貼圖渲染 - DirectX的
大多數技術都太複雜和沉重的原因,他們是指真正的3D模型,而所有我需要的是簡單的2D四邊形。
沒有人知道一個合適的技術或可以發佈一個有用的教程嗎? 哦,而DX只有請求。
謝謝。
我更有經驗與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;
}
那麼你甚至不需要形成正切基礎,這使得它很容易的話。假設,定向照明,如果您將光線轉換到視野空間,那麼您可以直接從法線貼圖中將光線(L)與法線(N)對準。通過簡單地將它與視圖矩陣相乘,就可以將光矢量轉換爲視圖空間。
如果你想要點光源,這有點複雜。你需要首先將你的光照位置轉換到視圖空間。然後,你需要從你的像素位置減去你的光的位置,規範所產生的載體和使用你方信用證載體在N.L計算:)
無論哪種,方法...完成任務! :D
「真實」3D模型僅由一堆2D多邊形組成。 – 2009-12-15 21:03:10
請注意,如果您使用旋轉(用於平鋪目的),則需要根據法線變換處理它。 – Stringer 2009-12-15 22:11:31
「」真正的「3D模型只是由一堆2D多邊形組成的。」 - 的確如此,但是在處理「真實」3D模型時,您也正在處理3D空間中的旋轉,這使得所有事情都變得更加複雜(並且由於我發現的技術旨在解決這個問題,所以它們太複雜,殺死我的需求)。 另外,請注意恰好在3D空間中的平面四邊形和由幾十個(如果不是更多)多邊形在3D空間中散佈的網格組成的網格,而每個多邊形法線都是多邊形因子的因子,法線圖 - 這是另一種併發症 – rubi 2009-12-15 21:35:46