軟體光柵化渲染器 六

2021-07-31 20:44:00 字數 2884 閱讀 8746

加入了透視矯正, 畫素的覆蓋遵循了左上的原則。

對1/z進行插值,將結果在除以1/z得到正確的插值。

//透視矯正紋理

void fillbottom********bytexcorrect(const ******** &t)

else if (t.vertex[1].newpos

.y == t.vertex[2].newpos

.y)

else

if (left.newpos

.x > right.newpos

.x)

float leftdxdivdy = (bottom.newpos

.x - left.newpos

.x) / ((float)bottom.newpos

.y - (float)left.newpos

.y);

float rightdxdivdy = ((float)right.newpos

.x - (float)bottom.newpos

.x) / ((float)right.newpos

.y - (float)bottom.newpos

.y);

float xleft = (float)left.newpos.x;

float xright = (float)right.newpos.x;

int y = left.newpos.y;

//1/z

float leftdxdivdyreciprocalz = ((1 / bottom.newpos

.z) - (1 / left.newpos

.z)) / (bottom.newpos

.y - left.newpos

.y);

float rightdxdivdyreciprocalz = ((1 / right.newpos

.z) - (1 / bottom.newpos

.z)) / (right.newpos

.y - bottom.newpos

.y);

float xleftreciprocalz = 1 / left.newpos.z;

float xrightreciprocalz = 1 / right.newpos.z;

//ufloat leftdxdivdycoloru = (bottom.uv

.x / bottom.newpos

.z - left.uv

.x / left.newpos

.z) / (bottom.newpos

.y - left.newpos

.y);

float rightdxdivdycoloru = (right.uv

.x / right.newpos

.z - bottom.uv

.x / bottom.newpos

.z) / (right.newpos

.y - bottom.newpos

.y);

float xleftcoloru = left.uv

.x / left.newpos.z;

float xrightcoloru = right.uv

.x / right.newpos.z;

//vfloat leftdxdivdycolorv = (bottom.uv

.y / bottom.newpos

.z - left.uv

.y / left.newpos

.z) / (bottom.newpos

.y - left.newpos

.y);

float rightdxdivdycolorv = (right.uv

.y / right.newpos

.z - bottom.uv

.y / bottom.newpos

.z) / (right.newpos

.y - bottom.newpos

.y);

float xleftcolorv = left.uv

.y / left.newpos.z;

float xrightcolorv = right.uv

.y / right.newpos.z;

while (y

< bottom.newpos

.y)

uint color = t.texbuffer[(uint)u + (uint)v * (uint)t.texwidth];

drawpoint(i, y, color);

colorstaru += dxcoloru;

colorstarv += dxcolorv;

reciprocalz += dxreciprocalz;

}y++;

xleft += leftdxdivdy;

xright += rightdxdivdy;

xleftreciprocalz += leftdxdivdyreciprocalz;

xrightreciprocalz += rightdxdivdyreciprocalz;

xleftcoloru += leftdxdivdycoloru;

xrightcoloru += rightdxdivdycoloru;

xleftcolorv += leftdxdivdycolorv;

xrightcolorv += rightdxdivdycolorv;}}

發現了個新問題,背面剔除貌似有問題。

github專案位址

軟體光柵化渲染器 十

環境光,一般場景中只有乙個環境光源 環境光 class light 定向光源,方向一定,並且光不會衰減 方向光源 class directionlight public light 計算鏡面高光 l direction double x l.x 2 vectordot l,vertex.normal...

光柵渲染器(四)多邊形繪製

暫時找不到合適繪製多邊形的演算法,就自己豐衣足食,不當之處希望大家指出。首先繪製凸四邊形,畢竟這個渲染器我最低的要求就是能畫個正方體 演算法設計 多邊形是由多個三角形組合而成。希望通過輸入四個頂點繪製多邊形,但不能隨意指定頂點繪製多邊形,否則就是這樣 所以我們需要找到不相鄰的2個點,通過這2個點,分...

光柵渲染器(三)光柵化2D三角形

這篇主要講掃瞄轉換方法光柵化2d三角形 之前我們已經完成了線段的繪製,而三角形其實3條線段的首尾相連,所以我們只要給出三個不在同一直線的頂點就能繪製三角形 bresenham演算法是種相對高效的演算法,但目前我專案中的這一演算法在頂點x座標或y座標相同時還無法完成繪製。所以這一情況下,我選擇dda演...