本文主要是介绍设计自己的软渲染器3-渲染线框模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在这一部分,我们将实现线框模型的显示与渲染,实际上就是把点连接起来。
画线算法很多,我在这里介绍经典的画线算法:
Bresenham快速画直线算法
直线光栅化是指用像素点来模拟直线,比如下图用蓝色的像素点来模拟红色的直线。
给定两个点起点P1(x1, y1), P2(x2, y2),设line(p1,p2)的斜率为k,p1.x<p2.x,0<k<1
则,从p1开始,下一个点要么在他的右邻接点要么在他的右上邻接点,每次x++。如何选择这两个点呢,利用这两个近似点距离实际点的距离来算,即如果线段ax+by+c=0与x=x1+1的交点的y坐标大于(y+*y+1))/2则选右上邻接点,否则选择右邻接点,如此重复便可画完一条直线。同理当1<k<inf时,每次y++,考察x。
这样我们可以得到第一象限的所有直线画法。其实剩余的其他象限的直线画法于第一象限类似。
实现代码:(openGL四象限画直线)
void MyLine(int xs, int ys, int xe, int ye)
{
//Write your code here
intx,y,p;
intdx = xe - xs;
intdy = ye -ys;
x =xs;
y =ys;
p =2 * dy - dx;
if(abs(xe- xs) != 0 && abs(ye - ys) / abs(xe - xs) < 1)// K < 1
{
if(dx > 0 && dy >= 0 || dx < 0 && dy <= 0) {
if(dx< 0 && dy <= 0) {
dx= -dx;
dy = -dy;
x= xe;
y= ye;
}
glBegin(GL_POINTS);
for(inti = 0 ; i < dx ; i ++)
{
glVertex2i(x,y);
x++;
if( p < 0 )
{
p+= 2*dy;
}
else
{
y++;
p+= 2 * dy - 2 * dx;
}
}
glEnd();
}
elseif (dx > 0 && dy <= 0 || dx < 0 && dy >= 0){
if(dx< 0 && dy >= 0) {
dx= -dx;
dy= -dy;
x= xe;
y= ye;
}
dy= -dy;
glBegin(GL_POINTS);
for(inti = 0 ; i < dx ; i ++)
{
glVertex2i(x,y);
x++;
if( p < 0 )
{
p+= 2*dy;
}
else
{
y--;
p+= 2 * dy - 2 * dx;
}
}
glEnd();
}
}
else//K> 1
{
if(dx >= 0 && dy >= 0 || dx <= 0 && dy <= 0)
{
if(dx<= 0 && dy <= 0) {
dx= -dx;
dy= -dy;
x= xe;
y= ye;
}
glBegin(GL_POINTS);
for(inti = 0 ; i < dy ; i ++)
{
glVertex2i(x,y);
y++;
if( p < 0 )
{
p+= 2*dx;
}
else
{
x++;
p+= 2 * dx - 2 * dy;
}
}
glEnd();
}
elseif (dx > 0 && dy <= 0 || dx < 0 && dy >= 0)
{
if(dx < 0 && dy >= 0) {
dx= -dx;
dy= -dy;
x= xe;
y= ye;
}
dy= -dy;
glBegin(GL_POINTS);
for(inti = 0 ; i < dy ; i ++)
{
glVertex2i(x,y);
y--;
if( p < 0 )
{
p += 2*dx;
}
else
{
x++;
p+= 2 * dx - 2 * dy;
}
}
glEnd();
}
}
}
但是我们在这里,只需要在第一象限画线,可以简化为下面
voidDrawLine(intxs, int ys, int xe,int ye,UINT32color) {
// Bresenham line algorithm
int dx = abs(xe -xs);
int dy = abs(ye -ys);
int sx = (xs <xe) ? 1 : -1;
int sy = (ys <ye) ? 1 : -1;
int err = dx - dy;
while (true) {
PutPixel(xs, ys, color);
if ((xs ==xe) && (ys == ye)) break;
int e2 = 2 * err;
if (e2 > -dy) { err-= dy;xs += sx;}
if (e2 < dx) { err+= dx;ys += sy;}
}
}
我们在mesh中加入face表示其拥有的三角形面。
效果图
这篇关于设计自己的软渲染器3-渲染线框模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!