環境光,一般場景中只有乙個環境光源
//環境光
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演...