動(dòng)機(jī)
好的,讓我們總結(jié)一下實(shí)時(shí)渲染的工作原理。
我們?cè)谑澜缱鴺?biāo)中有一個(gè)三角形幕随,將其投影到屏幕上。
然后憔购,對(duì)于三角形內(nèi)的每個(gè)像素,我們計(jì)算其相對(duì)于三角形的重心坐標(biāo)岔帽,將重心坐標(biāo)傳遞給著色器玫鸟,然后著色器可以對(duì)三角形內(nèi)的任何內(nèi)容進(jìn)行插值:紋理坐標(biāo),法線犀勒,顏色等屎飘。
正確的角度感知插值妥曲,檢查地板傾斜。我所做的只是傳遞給著色器bc剪輯坐標(biāo)钦购,而不是bc屏幕逾一。嗯。讓我們找出原因肮雨。
非線性
主要的問題是變換鏈的非線性。為了從齊次坐標(biāo)過渡到3D箱玷,我們除以最后一個(gè)分量怨规,打破了變換的線性。因此锡足,我們沒有權(quán)利使用屏幕空間的重心坐標(biāo)在原始空間內(nèi)插任何東西(在透視變換之前)波丰。
讓我們以以下方式闡述我們的問題。
我們知道舶得,將一個(gè)屬于三角形ABC的點(diǎn)P轉(zhuǎn)換為透視分割后的點(diǎn)P':
我們知道點(diǎn)P'相對(duì)于三角形A'B'C'的重心坐標(biāo)(三角形的屏幕空間坐標(biāo)):
然后掰烟,知道屏幕空間坐標(biāo)A'B'C'和相對(duì)于A'B'C'的P'的重心坐標(biāo),我們需要找到相對(duì)于原始三角形ABC的P的重心坐標(biāo):
沒問題沐批,讓我們表達(dá)P':
乘以rP.z+1
因此我們得到表達(dá)式P = [ABC][某個(gè)向量]纫骑。但這是重心坐標(biāo)的定義!我們離目標(biāo)很近了。什么是已知的九孩,什么是未知的先馆?
α-β-γ-全底素是已知的。
rA.z + 1躺彬,rB.z + 1煤墙,rC.z + 1也是已知的,它們是傳遞給光柵化程序例程的三角形的坐標(biāo)宪拥。
我們需要找到最后一個(gè)東西仿野,即rP.z + 1或點(diǎn)P的z坐標(biāo)。借助它她君,我們可以找到點(diǎn)P的坐標(biāo)脚作。哇,一個(gè)丑陋的循環(huán)...
實(shí)際上缔刹,這不是問題鳖枕,讓我們打破循環(huán)。
在(歸一化的)重心坐標(biāo)中桨螺,所有分量的總和等于1宾符,因此alpha + beta + gamma = 1:
現(xiàn)在所有的符號(hào)都已經(jīng)知道了,我們可以將屏幕空間的重心坐標(biāo)轉(zhuǎn)換為世界空間的坐標(biāo)灭翔。
該變換不是線性的魏烫,但是它可以補(bǔ)償透視變形的非線性辣苏,從而在世界空間坐標(biāo)中進(jìn)行線性插值。
檢查上圖的正確圖像哄褒。