軟體光柵化渲染器 十

2021-08-01 21:47:42 字數 2497 閱讀 6624

環境光,一般場景中只有乙個環境光源

//環境光

class light

};

定向光源,方向一定,並且光不會衰減

//方向光源

class directionlight :public light

//計算鏡面高光

l = direction;

double x = l.x - 2 * vectordot(l, vertex.normal) * vertex.normal.x;

double y = l.y - 2 * vectordot(l, vertex.normal) * vertex.normal.y;

double z = l.z - 2 * vectordot(l, vertex.normal) * vertex.normal.z;

vector3d rvector = ;

vector3d v = objectpos - vertex.vertex

; vectornormalize(rvector);

vectornormalize(v);

double is = pow(vectordot(rvector, v), material.shininess);

if (is > 0)

//判斷是否溢位

r = r > 1.0 ? 1.0 : r;

g = g > 1.0 ? 1.0 : g;

b = b > 1.0 ? 1.0 : b;

return color(color.r *r, color.g *g, color.b *b);}};

聚光燈

//聚光燈

class spotlight :public light

void setoutangle(double outangle)

color calculatecolor(const vertex3d &vertex, const material &material, const point3d &objectpos)

double angle = acos(dp);

//本影

if (angle < inangle)

//計算鏡面高光

l = vertex.vertex - position;

double x = l.x - 2 * vectordot(l, vertex.normal) * vertex.normal.x;

double y = l.y - 2 * vectordot(l, vertex.normal) * vertex.normal.y;

double z = l.z - 2 * vectordot(l, vertex.normal) * vertex.normal.z;

vector3d rvector = ;

vector3d v = objectpos - vertex.vertex;

vectornormalize(rvector);

vectornormalize(v);

double is = pow(vectordot(rvector, v), material.shininess);

if (is > 0)

}//半影

else if (angle >= inangle && angle < outangle)

//計算鏡面高光

l = vertex.vertex - position;

double x = l.x - 2 * vectordot(l, vertex.normal) * vertex.normal.x;

double y = l.y - 2 * vectordot(l, vertex.normal) * vertex.normal.y;

double z = l.z - 2 * vectordot(l, vertex.normal) * vertex.normal.z;

vector3d rvector = ;

vector3d v = objectpos - vertex.vertex;

vectornormalize(rvector);

vectornormalize(v);

double is = pow(vectordot(rvector, v), material.shininess);

if (is > 0)

}//判斷是否溢位

r = r > 1.0 ? 1.0 : r;

g = g > 1.0 ? 1.0 : g;

b = b > 1.0 ? 1.0 : b;

return color(r, g, b);

}業餘時間搞了差不多2個月,功能基本實現了,但只是實現了, 優化和**水平太渣,不忍直視。收貨也不小,理解了3d立體到2d平面上是怎樣乙個過程了。

github位址

軟體光柵化渲染器 六

加入了透視矯正,畫素的覆蓋遵循了左上的原則。對1 z進行插值,將結果在除以1 z得到正確的插值。透視矯正紋理 void fillbottom bytexcorrect const t else if t.vertex 1 newpos y t.vertex 2 newpos y else if le...

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

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

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

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