加入了透視矯正, 畫素的覆蓋遵循了左上的原則。
對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演...