gpt4 book ai didi

math - 数学计算简单的图形管线

转载 作者:行者123 更新时间:2023-12-04 18:08:22 26 4
gpt4 key购买 nike

我试图做/理解图形管道中从VRML之类的3D场景描述中渲染简单2D图像所需的所有基本数学计算。是否有所需步骤的好示例,例如模型转换(对象坐标到世界坐标),视图转换(从世界坐标到视图坐标),照明顶点法线的计算,修剪,计算视图内对象的屏幕坐标截锥体并创建2D投影以计算带有颜色的单个像素。

最佳答案

我已经习惯了OpenGL风格的渲染数学,所以我坚持使用它(所有渲染都使用几乎相同的数学)

首先来一些热身来解释:


变换矩阵

表示3D空间中的坐标系

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轴的单位向量
P(x0,y0,z0)是GCS中表示的坐标系的原点


转换矩阵用于在GCS和LCS(局部坐标系)之间转换坐标


GCS -> LCS: Al = Ag * m;
GCS <- LCS: Ag = Al * (m^-1);
Al (x,y,z,w=1)是LCS中的3D点...在均匀坐标中
Ag (x,y,z,w=1)是GCS中的3D点...在均匀坐标中


添加了均质坐标 w=1,因此我们可以将3D矢量乘以4x4矩阵


m转换矩阵
m^-1逆变换矩阵


在大多数情况下, m是正交的,这意味着 X,Y,Z向量彼此垂直,并且具有单位大小,可以用于旋转,平移等之后恢复矩阵的精度...

有关更多信息,请参见 Understanding 4x4 homogenous transform matrices
渲染矩阵

通常使用以下矩阵:


model-表示实际的渲染对象坐标系
view-表示相机坐标系( Z轴是视图方向)
modelview-模型和视图相乘
normal-与 modelview相同,但 x0,y0,z0 = 0用于法向矢量计算
texture-操作纹理坐标以简化纹理动画并效果通常为单位矩阵
projection-代表摄像机视图的投影( perspective,正射,...),它不应包含任何旋转或平移,更像是摄像机传感器校准(否则雾和其他效果将失败...)

渲染数学

要渲染3D场景,您需要2D渲染例程,例如绘制2D纹理三角形。渲染将3D场景数据转换为2D并进行渲染。那里有更多的技术,但最常用的是使用边界模型表示+边界渲染(仅表面)3D -> 2D转换是通过投影(正交或透视)和Z缓冲区或Z排序完成的。


Z缓冲区易于使用,并且是现今gfx硬件所固有的
Z排序由CPU代替,因此它的速度较慢并且需要额外的内存,但是这对于正确的透明曲面渲染是必需的。



所以管道是这样的:


从模型获取实际的渲染数据


顶点 v
普通 n
纹理坐标 t
颜色,雾度等

将其转换为适当的空间


v=projection*view*model*v ...相机空间+投影
n=normal*n ...全球空间
t=texture*t ...纹理空间

将数据剪辑到屏幕

此步骤不是必需的,但可以加快渲染屏幕内容的速度,而且通常在此处进行人脸剔除。如果渲染的“三角形”的法向矢量相反,则多边形缠绕规则集将忽略“三角形”
渲染3D / 2D数据

仅使用 v.x,v.y坐标进行屏幕渲染,使用v.z进行z缓冲区测试/值,这里也进行透视投影的透视划分


v.x/=v.z,vy/=v.z


Z缓冲区的工作方式如下:Z缓冲区( zed)是2D数组,其大小(分辨率)与屏幕( scr)相同。在这种情况下,任何像素 scr[y][x]仅呈现 if (zed[y][x]>=z) scr[y][x]=color; zed[y][x]=z; if条件可以不同(可更改)

在使用三角形或更高级的图元进行渲染的情况下,生成的2D图元在称为栅格化的过程中转换为像素,例如:


Algorithm to fill triangle



为了更加清楚,这是它的外观:



[笔记]

转换矩阵是可乘的,因此,如果您需要通过 N矩阵转换 M点,则可以创建单个 matrix = m1*m2*...mM并仅通过由此得到的 N转换 matrix点(用于速度)。有时使用 3x3变换矩阵+ shift vector代替 4x4矩阵。在某些情况下它是更快的,但是您不能轻易地将更多的变换相乘。对于变换矩阵操纵,请寻找诸如Rotate或Translate之类的基本操作,在LCS内还存在用于旋转的矩阵,这些矩阵更适合于人工控制输入,但它们并非像OpenGL或DirectX那样固有于渲染。 (因为他们使用逆矩阵)

现在,以上所有内容均用于标准多边形渲染(对象的表面边界表示)。还有其他渲染器,如体积渲染或(后退)光线跟踪器和混合方法。场景也可以具有任何尺寸,而不仅仅是3D。以下是一些涉及这些主题的相关质量检查:


GLSL 3D Volumetric back raytracer
GLSL 3D Mesh back raytracer
2D Doom/Wolfenstein techniques
4D Rendering techniques

关于math - 数学计算简单的图形管线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com