2009-12-17 32 views
0

作爲一項家庭作業,我們正在編寫一個軟件光柵化程序。我已經注意到我的z緩衝區不能正常工作,所以我試圖通過輸出到屏幕來調試它。 (黑色近,白色遠離)。在軟件光柵化程序中實現z緩衝區

但是,我得到了每個頂點z的奇特值。這是我用來變換點:

float Camera::GetZToPoint(Vec3 a_Point) 
{ 
    Vec3 camera_new = (m_MatRotation * a_Point) - m_Position; 

    return (HALFSCREEN/tanf(_RadToDeg(60.f * 0.5f))/camera_new.z); 
} 

m_MatRotation是一個3x3矩陣。將其乘以一個矢量將返回一個變換後的矢量。

我得到0和x之間的最大值和最小值,其中x是一個看似隨機數。

我是否正在做這個轉變的權利?如果是這樣,我怎樣才能正常化我的Z值,使它位於兩個設定點之間?

在此先感謝。

回答

4

要標準化Z值,您必須定義一個近剪裁平面和一個遠剪裁平面。然後你將Z歸一化,使它在近平面處爲0,在遠平面處爲1。

但是,您通常會在投影后執行此操作。看起來最後一行是投影發生的地方。

其他的一些事情:

  • 您計算全矩陣向量乘法,但只保留Z,這是一種浪費。你應該考慮改變點並保留所有的X,Y,Z座標;
  • 您在每個頂點重新計算tanf(),但是它的常量;
  • 我建議你使用投影矩陣而不是tanf計算;
  • 從簡單的正交投影開始,它將更容易調試。
1

假設你想知道在vertez,這將是a_Point Z:

首先,你要這樣執行在你的相機的旋轉而不是原點旋轉之前執行轉換你的空間,可能在別的地方。其次,camera_new沒有很好地選擇一個名稱,因爲它代表相機位置的新參考集中a_Point的座標。相反,做到以下幾點:

Vec3 point_new = (m_MatRotation * (a_Point-m_Position)); 

如果不工作,你必須通過創建執行一個乘法平移,旋轉和投影所有真正的投影矩陣做了艱辛的道路。這裏有一些教程,幫助我瞭解如何做到這一點。

http://www.songho.ca/opengl/gl_projectionmatrix.html

codeguru.com/cpp/misc/misc/math/article.php/c10123/

一旦你已經成功地投影到屏幕上的頂點在透視正確的方法,你」我們必須找到一種方法來填充它們之間的空間,並找出填充的每個像素是什麼z。這是一個全新的故事,維基百科關於紋理貼圖的文章幫助我做到了這一點。

en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness

抱歉,我不能給你更多的鏈接,#1不會讓我,因爲我是一個新用戶...