Math 数学计算一个简单的图形管道
我正在尝试做/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像。是否有所需步骤的良好示例,如模型变换(对象坐标到世界坐标),视图变换(从世界坐标到视图坐标),计算照明的顶点法线,剪裁,计算视锥体内物体的屏幕坐标,并创建2D投影以计算带有颜色的单个像素。您可以从Hughes等人的《计算机图形学:原理与实践-第三版》一书中查看该章 导出光线投射和光栅化算法,然后构建 软件光线跟踪器的完整源代码,软件 光栅化器和硬件加速光栅化渲染器Math 数学计算一个简单的图形管道,math,graphics,3d,Math,Graphics,3d,我正在尝试做/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像。是否有所需步骤的良好示例,如模型变换(对象坐标到世界坐标),视图变换(从世界坐标到视图坐标),计算照明的顶点法线,剪裁,计算视锥体内物体的屏幕坐标,并创建2D投影以计算带有颜色的单个像素。您可以从Hughes等人的《计算机图形学:原理与实践-第三版》一书中查看该章 导出光线投射和光栅化算法,然后构建 软件光线跟踪器的完整源代码,软件 光栅化器和硬件加速光栅化渲染器 我习惯于使用OpenGL样式渲
我习惯于使用OpenGL样式渲染数学,因此我坚持使用它(所有渲染使用几乎相同的数学) 首先要解释的是:
double m[16]; // it is 4x4 matrix stored as 1 dimensional array for speed
m[0]=xx; m[4]=yx; m[ 8]=zx; m[12]=x0;
m[1]=xy; m[5]=yy; m[ 9]=zy; m[13]=y0;
m[2]=xz; m[6]=yz; m[10]=zz; m[14]=z0;
m[3]= 0; m[7]= 0; m[11]= 0; m[15]= 1;
其中:
是X(xx,xy,xz)
轴在GCS中的单位矢量(全球坐标系)X
是Y(yx,yy,yz)
轴在GCS中的单位向量Y
是Z(zx,zy,zz)
轴在GCS中的单位向量Z
是在GCS中表示的坐标系的原点P(x0,y0,z0)
- GCS
LCS:->
Al=Ag*m代码>
- GCS
2D转换通过投影(正交或透视)和Z缓冲区或Z排序完成- Z-buffer对于现在的gfx硬件来说非常简单和自然
- Z排序由CPU执行,因此速度较慢,需要额外内存,但这对于正确的透明曲面渲染是必需的
- 从模型中获取实际渲染数据
- 顶点
v
- 正常
n
- 纹理coord
t
- 颜色、雾坐标等
- 将其转换为适当的空间
。。。相机空间+投影v=投影*视图*模型*v
。。。全局空间n=正常*n
。。。纹理空间t=texture*t
- 将数据剪辑到屏幕上 这一步不是必需的,但为了提高速度,防止渲染屏幕内容,而且通常在这里进行面剔除。如果渲染的“三角形”的法向量相反,则多边形缠绕规则集将忽略“三角形”
- 渲染三维/二维数据 仅使用
v.x,v.y
坐标进行屏幕渲染,使用v.z进行z缓冲区测试/值。这里还有透视投影的透视分割
v.x/=v.z,vy/=v.z
zed
)是2D阵列,其大小(分辨率)与屏幕相同(scr
)。任何像素scr[y][x]
仅当(zed[y][x]>=z)在这种情况下scr[y][x]=颜色时才渲染;zed[y][x]=z代码>if条件可以不同(可以更改)
在使用三角形或更高的基本体进行渲染的情况下,生成的2D基本体将在称为光栅化的过程中转换为像素,例如:
为了更清楚,这里是它的样子:
[Notes]
变换矩阵是乘法矩阵,因此,如果需要将N
点变换为M
矩阵,则可以创建单个matrix=m1*m2*…mM
,并仅通过由此产生的matrix
转换N
点(用于速度)。有时使用3x3
transform matrix+shift vector
代替4x4
矩阵。在某些情况下,它的速度更快,但您无法如此轻松地将更多的变换相乘在一起。对于变换矩阵操作,请查看诸如旋转或平移之类的基本操作。LCS中也有旋转矩阵,它们更适合于人工控制输入,但它们不是像OpenGL或DirectX这样的渲染所固有的。(因为它们使用逆矩阵)
现在,以上所有内容都是用于标准多边形渲染(对象的曲面边界表示)。还有其他渲染器,如体积渲染或(背面)光线跟踪器和混合方法。此外,场景可以具有任何维度,而不仅仅是3D。以下是一些相关的QA,涵盖以下主题:
您想要什么样的例子?为显式场景执行所有这些步骤的人?还是一个明确的编程框架?或者哪一个给出了一个类似于你发布的步骤的列表?我正在寻找一个显示所有计算并解释数学的显式场景的示例。我想了解渲染的数学步骤:-)是开源的。@FelixCastor-谢谢你的回答,但我要找的是数学计算和示例,不是软件:-)这是机器人的,但它使用的是相同的