我在我的3D世界中添加線條,就像我們在3D studio max中看到的一樣。爲了繪製線條,我使用圓筒網格,並簡單地拉伸/旋轉它。這一切工作正常,但我的問題是規模。由於3D立體幾何呈現的透視效果,它的大小會隨着距離的變化而變小,從而變得不可見,最後變得非常大。在3D(DirectX)中繪製線條?
我想使它的線幾何尺寸保持不變。我嘗試着用正射投影四處遊蕩,但什麼也沒有。有任何想法嗎?
我在我的3D世界中添加線條,就像我們在3D studio max中看到的一樣。爲了繪製線條,我使用圓筒網格,並簡單地拉伸/旋轉它。這一切工作正常,但我的問題是規模。由於3D立體幾何呈現的透視效果,它的大小會隨着距離的變化而變小,從而變得不可見,最後變得非常大。在3D(DirectX)中繪製線條?
我想使它的線幾何尺寸保持不變。我嘗試着用正射投影四處遊蕩,但什麼也沒有。有任何想法嗎?
那麼你可以很容易地寫一個着色器來解決這個問題。基本上你需要按照你生成的w值按比例推出它。即如果圓柱體的寬度爲r。那麼你可以通過將它推出到(r * w)來取消視角。這種方式發生w分割時,它總是會給你r。
但是,圓柱體可能會有點過頭,您可以通過繪製一條條紋的線條並應用紋理來獲得類似的效果。
我在DX8寫了一個着色器多年前就做到這一點(記住,這是與角度)。基本上我所定義的頂點數據如下:
struct BillboardLineVertex
{
D3DXVECTOR3 position;
D3DXVECTOR3 otherPosition;
DWORD colour;
D3DXVECTOR2 UV;
};
假設線從A變爲B,則位置是A和otherPosition爲B的第2個頂點。此外,我編碼到紫外線的V(或y)中,-1或1。這告訴我,我是否會從屏幕向上或向下推出。最後,三角形的第三個座標的位置是A & B,另一個位置是另一個位置(我會讓你找出如何建立另一個三角形。注意,U紋理座標(或x)可以設置爲允許紋理沿線重複。
我然後有着色器組件的以下位建行......這有額外的好處,它採取了正好2個三角形做一條線......然後我可以收拾他們所有到1個大的頂點緩衝和一個繪製調用渲染數百個。
asm
{
vs.1.1
// Create line vector.
mov r1, v0
sub r3, r1, v4
// Get eye to line vector
sub r6, v0, c20
// Get Tangent to line vector lieing on screen plane.
mul r5, r6.yzxw, r3.zxyw
mad r5, -r3.yzxw, r6.zxyw, r5
// Normalise tangent
dp3 r4.w, r5.xyz, r5.xyz
rsq r4.w, r4.w
mul r5.xyz, r5.xyz, r4.w
// Multiply by 1 or -1 (y part of UV)
mul r5.xyz, r5.xyz, -v9.y
// Push tangent out by "thickness"
mul r5.xyz, r5.xyz, c16.x
add r1.xyz, r1.xyz, r5.xyz
// Transform position
m4x4 oPos, r1, c0
// Work out UV (c16.y is assumed to contain 0.5, c16.z is assumed to contain 1)
mov r2.xy, v9.xy
mul r2.y, v9.y, v9.x
add r2.xy, r2.xy, c16.z
mul oT0.xy, r2.xy, c16.y
// Move colour into diffuse output channel.
mov oD0, v3
};
這樣的設置是很容易修改給你相同的大小,無論距離的相機。
Brillant ..和樂趣看到il asm代碼!我做了同樣的事情,但使用幾何着色器。它避免了重複其他位置的成本。還支持任意線寬和線型ala'glLineStipple'。 – Stringer 2010-09-29 13:40:42
@Stringer:我在2001年寫了這個代碼-ISH;)我同意你是否可以定位DX10幾何着色器是你的朋友:) – Goz 2010-09-29 13:45:43