GAMES101投影矩阵推导详解和分析

这篇具有很好参考价值的文章主要介绍了GAMES101投影矩阵推导详解和分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前推导过OpenGL的投影矩阵,学了GAMES101之后,发现老师的推导方式很有意思,且GAMES101的坐标系约定和OpenGL不一样。最近在填新坑URasterizer的过程中,发现了一些问题,比如透视投影在clip space做裁剪时为啥w必须取反,以及之前GAMES101作业中做深度测试时为啥z值要取反的问题,因此重新推导GAMES101的投影矩阵并分析一下。由于GAMES101的推导思路很有趣,因此整个过程会轻松愉快很多。

GAMES101投影矩阵相关坐标系的约定

GAMES101使用右手坐标系,包括View space和NDC space(Clip space)。

  • 对于View space,camera的位置为原点,看向负Z轴,这和OpenGL一致。GAMES101推导投影矩阵时,近裁面坐标n和远裁面坐标f都是使用的是坐标值,因此有 f < n < 0。
  • 对于NDC space, GAMES101的NDC中,x,y,z的坐标范围都是[-1,1]。虽然OpenGL也是[-1,1],但是需要注意的是,GAMES101中,由于View space和NDC space都是右手系,所以变换后z轴方向并没有变化,因此n被映射到了1,而f被映射到了-1,仍然符合 f < n,且。GAMES101讲义上也说了,near and far not intuitive (n>f) ,而OpenGL使用左手系的NDC更加直觉一些。
  • 下图是右手系的view space(以正交投影视景体为例),由于camera从原点看向负Z轴,因此n更靠近正Z,f更靠近负Z。
    games101,图形学,矩阵,线性代数
  • 当变换到NDC后,由于还是右手系,因此 n 映射到了 +1,f 映射到了 -1
    games101,图形学,矩阵,线性代数
    而对于OpenGL,NDC是左手坐标系,因此n被映射到-1,f被映射到1。(图就免了,上图反转Z轴)

正交投影矩阵的推导

由于正交投影只是把一个长方体变换到一个中心位于原点,坐标范围[-1,1]的立方体,因此通过移动加缩放即可完成变换。借用讲义中的图:
games101,图形学,矩阵,线性代数
首先把长方体的原点移动到坐标系原点,由于view space中长方体的中心点为 P o = [ ( r + l ) / 2 , ( t + b ) / 2 , ( n + f ) / 2 ] Po = [(r+l)/2, (t+b)/2, (n+f)/2] Po=[(r+l)/2,(t+b)/2,(n+f)/2],因此移动到原点只要移动 − P o -Po Po即可,写成平移矩阵就是:
games101,图形学,矩阵,线性代数
缩放也很简单,视景体在x,y,z三个轴上的长度分别是 ( r − l ) (r-l) (rl), ( t − b ) (t-b) (tb) ( n − f ) (n-f) (nf),注意这儿都是大数减小数,上面说过n>f,虽然它们都是小于0的负数,但 ( n − f ) (n-f) (nf)仍然是正数。而NDC的标准立方体的长宽高都是2。因此x,y,z轴的缩放系数分别是 2 / ( r − l ) 2/(r-l) 2/(rl), 2 / ( t − b ) 2/(t-b) 2/(tb) 2 / ( n − f ) 2/(n-f) 2/(nf),写成缩放矩阵就是:
games101,图形学,矩阵,线性代数
将上面两个矩阵相乘,注意GAMES101和OpenGL一样,都是矩阵在左,向量在右进行向量变换的,因此矩阵连乘时,先起作用的矩阵在右边(更靠近向量),所以最终的正交投影矩阵就是:
games101,图形学,矩阵,线性代数
手动乘了一下,结果是:
M o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − f + n n − f 0 0 0 1 ] M_{ortho} = \left[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{f+n}{n-f} \\ 0 & 0 & 0 & 1 \end{matrix}\right] Mortho=rl20000tb20000nf20rlr+ltbt+bnff+n1

和OpenGL正交投影矩阵的比较

如上所述,GAMES101的投影坐标系约定和OpenGL基本一致,区别就在于NDC手向性不同。在参数方面,经典的OpenGL函数 g l O r t h o ( l e f t , r i g h t , t o p , b o t t o m . n e a r , f a r ) glOrtho(left, right, top, bottom. near, far) glOrtho(left,right,top,bottom.near,far),前四个参数是左右上下剪裁面的坐标值,这和GAMES101一致。但near, far并不是坐标值(负数),而是距离near/far plane的距离值:

Specify the distances to the nearer and farther depth clipping planes. These distances are negative if the plane is to be behind the viewer.

既然是距离值,正常情况就是正数了。但是glOrtho中也可使用负数near,far,但其含义并不是坐标值,而是表示平面在视点后面(这有什么意义?)。
综合以上两点差异,对于NDC的差异,就是z轴方向反了,那么只要将GAMES101的变换矩阵再乘一个Z轴缩放-1的矩阵就可以右手系变左手系,而n,f参数意义的差异,只要n和f各自取负就行。那么:
M g l o r t h o = [ 1 0 0 0 0 1 0 0 0 0 − 1 0 0 0 0 1 ] ∗ [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 f − n f + n f − n 0 0 0 1 ] = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 − 2 f − n − f + n f − n 0 0 0 1 ] M_{glortho} = \left [\begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix}\right] * \left[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{f-n} & \frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{matrix}\right] = \left[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{matrix}\right] Mglortho=1000010000100001rl20000tb20000fn20rlr+ltbt+bfnf+n1=rl20000tb20000fn20rlr+ltbt+bfnf+n1
乘式右边的矩阵是GAMES101正交投影矩阵n和f分别取负的结果,最终得到了OpenGL的正交投影矩阵。

正交投影clip space中顶点的w值

我们知道投影矩阵的作用是将顶点从view space变换到clip space(而不是NDC),NDC是由clip space经过透视除法 ( x / w , y / w , z / w ) (x/w,y/w,z/w) (x/w,y/w,z/w)得到的。对于正交投影,其实不存在透视除法,但是为了流水线的统一,还是需要经过一个除以w的过程。而我们推导的正交投影矩阵将顶点从view space变换到clip space后,其坐标的w值是1(因为矩阵最后一行是 ( 0 , 0 , 0 , 1 ) (0,0,0,1) (0,0,0,1)),因此可兼容于流水线。
为啥要强调一下w为1呢?我们思考一下这个问题,我们经常说NDC中的坐标范围为[-1,1],而clip space是[-w,w]。所以如果我们在clip space中判断一个点是否在视景体内,只要判断 -w <= p <= w 是否成立。但是以上式子成立的条件是 w > 0,因为如果 w < 0, 那么clip space的坐标范围就是[w, -w]了,比较也要反过来。而正交投影时,w为1,是个正数,所以天然满足 -w <= p <= w,但是下面推导透视投影矩阵后会发现,在GAMES101的约定下,透视投影后,clip space的w值是一个负数。

透视投影矩阵的推导

GAMES101的推导方法很有趣,首先将透视投影的Frustum挤压成一个正交投影那样的长方体视景体,然后对长方体进行正交投影,得到NDC立方体:
games101,图形学,矩阵,线性代数
所以主要的工作就是推导这个挤压矩阵。

推导透视投影frustum挤压到正交投影视景体的矩阵

看上面的图,需要分别沿着x轴和y轴进行挤压。先看y轴的情况,x轴可以类比。
games101,图形学,矩阵,线性代数
这是讲义上的示例图,但要注意并不是说把 ( x , y , z ) (x,y,z) (x,y,z)点挤压到 ( x ′ , y ′ , z ′ ) (x',y',z') (x,y,z),如果点在远裁面上,那么挤压后应该是在绿色点的位置,如果点在近裁面上,那么不用挤压了,就是 ( x ′ , y ′ , z ′ ) (x',y',z') (x,y,z)。那么中间的点呢?显然挤压后是在绿色的虚线上,但是其z坐标如何变化,是向 n n n移动,还是向 f f f移动?这是GAMES101的思考题,下面再说。
虽然示例图标识的不是挤压后点的位置,但是挤压后,y坐标确实变成了y’,利用相似三角形是可以得到y’和y的关系:
y ′ = n z y y' = \frac{n}{z}y y=zny
同样类比可得,挤压后x’和x的关系:
x ′ = n z x x' = \frac{n}{z}x x=znx
这里出现了除z,而我们使用的是齐次坐标,因此可以将变换后的点乘以z,得到表示同一个点的齐次坐标:
games101,图形学,矩阵,线性代数
这样,我们需要推导的Persp to ortho矩阵的作用就是将view space 的顶点变换到这样的齐次坐标:
games101,图形学,矩阵,线性代数
从x,y坐标的对应关系: x = > n x , y = > n y x => nx, y => ny x=>nx,y=>ny,可以填入矩阵的前两行:
games101,图形学,矩阵,线性代数
为了解出最后一行,需要用到z坐标的映射关系,当z为n时,挤压后的点的z也是n,因此齐次坐标的z就是 n 2 n^2 n2:
games101,图形学,矩阵,线性代数
设第三行为 ( 0 , 0 , A , B ) (0, 0, A, B) (0,0,A,B),有:
games101,图形学,矩阵,线性代数
同样,位于远裁面的点,z值为f,挤压后仍然为f,代入方程,可得:
games101,图形学,矩阵,线性代数
利用上面两个关于A和B的方程式,可计算出A和B:
games101,图形学,矩阵,线性代数
这就得到了从透视投影变换到正交投影的矩阵:
M p e r s p − > o r t h o = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] M_{persp->ortho} = \left[\begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \end{matrix}\right] Mpersp>ortho=n0000n0000n+f100nf0

最终的GAMES101透视投影矩阵

使用上面推导的正交投影矩阵乘上这个矩阵就得到最终的透视投影矩阵了:
M p e r s p = M o r t h o M p e r s p − > o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − f + n n − f 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] = M_{persp} = M_{ortho}M_{persp->ortho} = \left[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{f+n}{n-f} \\ 0 & 0 & 0 & 1 \end{matrix}\right] \left[\begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \end{matrix}\right] = Mpersp=MorthoMpersp>ortho=rl20000tb20000nf20rlr+ltbt+bnff+n1n0000n0000n+f100nf0=
[ 2 n r − l 0 − r + l r − l 0 0 2 n t − b − t + b t − b 0 0 0 n + f n − f − 2 n f n − f 0 0 1 0 ] \left[\begin{matrix} \frac{2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{n+f}{n-f} & -\frac{2nf}{n-f} \\ 0 & 0 & 1 & 0 \end{matrix}\right] rl2n0000tb2n00rlr+ltbt+bnfn+f100nf2nf0

和OpenGL透视投影矩阵的比较

如前所述,区别首先在于NDC的手向性,另外就是OpenGL的经典函数 g l F r u s t u m ( l e f t , r i g h t , b o t t o m , t o p , n e a r V a l , f a r V a l ) glFrustum(left, right, bottom, top, nearVal, farVal) glFrustum(left,right,bottom,top,nearVal,farVal), 前4个参数都是坐标值,而后两个是距离值(正值)。那么我们像正交投影一样操作,将n和f取负,并且左乘一个翻转z轴的缩放矩阵:
M g l P e r s p = [ 1 0 0 0 0 1 0 0 0 0 − 1 0 0 0 0 1 ] ∗ [ − 2 n r − l 0 − r + l r − l 0 0 − 2 n t − b − t + b t − b 0 0 0 − n + f f − n − 2 n f f − n 0 0 1 0 ] = M_{glPersp} = \left [\begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix}\right] * \left[\begin{matrix} \frac{-2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{-2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{n+f}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & 1 & 0 \end{matrix}\right]= MglPersp=1000010000100001rl2n0000tb2n00rlr+ltbt+bfnn+f100fn2nf0=
[ − 2 n r − l 0 − r + l r − l 0 0 − 2 n t − b − t + b t − b 0 0 0 f + n f − n 2 n f f − n 0 0 1 0 ] \left[\begin{matrix} \frac{-2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{-2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{f+n}{f-n} & \frac{2nf}{f-n} \\ 0 & 0 & 1 & 0 \end{matrix}\right] rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2nf0
但是OpenGL的透视投影矩阵并不是这样的啊?别的不说,至少最后一行明明是 ( 0 , 0 , − 1 , 0 ) (0,0,-1,0) (0,0,1,0)。这是因为OpenGL设计出来的矩阵,clip space的w坐标值为 − Z v i e w -Z_{view} Zview。而GAMES101的w值是 Z v i e w Z_{view} Zview。这是上面没有说的第3个差异。所以我们需要w值取反,对于齐次坐标来说,所有元素乘以同一个系数和原来的坐标是一样的,因此为了让w取反,只要所有坐标同时乘-1就行。那么我们在前面再乘一个x,y,z,w都缩放-1的矩阵:
M g l P e r s p = [ − 1 0 0 0 0 − 1 0 0 0 0 − 1 0 0 0 0 − 1 ] ∗ [ − 2 n r − l 0 − r + l r − l 0 0 − 2 n t − b − t + b t − b 0 0 0 f + n f − n 2 n f f − n 0 0 1 0 ] = M_{glPersp} = \left [\begin{matrix} -1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & -1 \end{matrix}\right] * \left[\begin{matrix} \frac{-2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{-2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{f+n}{f-n} & \frac{2nf}{f-n} \\ 0 & 0 & 1 & 0 \end{matrix}\right]= MglPersp=1000010000100001rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2nf0=
[ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 − f + n f − n − 2 n f f − n 0 0 − 1 0 ] \left[\begin{matrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \end{matrix}\right] rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2nf0
这就对了。所以约定真的是对投影矩阵的影响很大,随便搞错一个地方,得到的矩阵就不对,算出来的坐标就需要在哪儿莫名其妙的取个负。

透视投影clip space中顶点的w值

如前所述,在GAMES101的约定下,最终clip space的w值为 Z v i e w Z_{view} Zview,由于Camera从原点看向-Z轴,所以view space中,在Frustum内的顶点的 Z v i e w Z_{view} Zview应该是一个负数,既w是负数。因此在clip space中使用w值判断点是否在Frustum内时,需要判断的区间为[w,-w]。是不是很不直觉?我是在实现URasterizer的clip功能时发现的这个问题,一开始我就是直接判断 -w <= P <= w,结果是所有的点都被裁剪掉了,什么都没剩下。上面也说了,OpenGL设计的w值为 − Z v i e w -Z_{view} Zview,由于OpenGL的约定下,符合条件的点的 Z v i e w Z_{view} Zview也是负数,因此w就是正数,这样就科学多了。

GAMES101思考题:视景体挤压后z值为(n+f)/2的点会挤向n还是f

在GAMES101课上,闫老师提出一个思考题,在挤压之后,近裁面和远裁面上的点的z坐标保持不变,那么中间的点的z坐标如何变化呢,是向 n n n移动,还是向 f f f移动,以z值为 ( n + f ) / 2 (n+f)/2 (n+f)/2的点为例。
这个问题很难用脑子想,反正我是想不通,所以直接算一下。设原来的点为 ( x , y , ( n + f ) / 2 ) (x,y,(n+f)/2) (x,y,(n+f)/2),那么挤压后的点为:
P = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] ∗ [ x y n + f 2 1 ] = [ n x n y n 2 + f 2 2 n + f 2 ] = [ − − − − n 2 + f 2 n + f 1 ] P = \left[\begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \end{matrix}\right] * \left[\begin{matrix} x\\ y \\ \frac{n+f}{2} \\ 1 \end{matrix}\right] = \left[\begin{matrix} nx\\ ny \\ \frac{n^2+f^2}{2} \\ \frac{n+f}{2} \end{matrix}\right] = \left[\begin{matrix} --\\ -- \\ \frac{n^2+f^2}{n+f} \\ 1 \end{matrix}\right] P=n0000n0000n+f100nf0xy2n+f1=nxny2n2+f22n+f=n+fn2+f21
所以z值从 ( n + f ) / 2 (n+f)/2 (n+f)/2挤压到了 ( n 2 + f 2 ) / ( n + f ) (n^2+f^2)/(n+f) (n2+f2)/(n+f), 用前值减去后值,化解之后得到:
− ( n − f ) 2 / 2 ( n + f ) -(n-f)^2/2(n+f) (nf)2/2(n+f)
由于n和f是负数,所以整个结果是正数,这说明原来的z坐标值大于挤压后的z坐标,因此中间点向近裁面移动了。文章来源地址https://www.toymoban.com/news/detail-717738.html

到了这里,关于GAMES101投影矩阵推导详解和分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GAMES101 计算机图形学 | 学习笔记 (上)

    1. C++中安装opencv库 2. C++中安装eigen库 3. C++中安装openGL库 步骤(1)glut下载 4. C++安装openGL库 步骤(2)VS中安装两个NuGet程序包 5. C++安装glew和glfw工具库 要注意的是 glew.h必须包含再glut.h之前 。 如下: 计算机图形学是利用计算机技术进行图像和视觉内容的创建、处理和显示的领

    2024年02月03日
    浏览(43)
  • Games101学习笔记 - 变换矩阵基础

    缩放变换 : 1均匀缩放 2不均匀缩放 注意:上图是默认二维旋转的是以远点为圆转重心,并且逆时针旋转 旋转矩阵推导原理: 引入原因: 上面说了ax + by 的方式都可以写成矩阵的形式,但是平移的操作的公式如下,不能写成矩阵的形式。 只能写成如下: 为了同意变换,让他

    2024年02月15日
    浏览(31)
  • games101-2 透视深度插值矫正与抗锯齿分析

    透视深度插值矫正与抗锯齿分析 深度插值的差错原因 透视深度插值公式推导 games101中的错误 msaa与ssaa简要定义 games101中ssaa的实现 games101中msaa的实现 当投影的图形与投影的平面不平行时,这时进行透视投影,从上图中可以看出,投影平面上的线段时均匀的,但是在原图形上

    2024年02月05日
    浏览(29)
  • games101-3 BRDF101

    本文基于知乎Maple对brdf的文章,在此基础又收集了一些其它来源的关于brdf的文章,希望能够完全理解记忆相关知识 关于Jakub Boksansky的文章,看的过程中又去搜集了很多其它文章来理解,发现已经超出了我目前的知识厚度,因此只会简单的翻译一下我能理解的部分,感兴趣的

    2024年04月25日
    浏览(32)
  • GAMES101:作业3

    附其他所有作业超链接如下: Games101 作业0: 作业0 Games101 作业1: 作业1 Games101 作业2: 作业2 Games101 作业3: 作业3 Games101 作业4: 作业4 Games101 作业5: 作业5 Games101 作业6: 作业6 Games101 作业7: 作业7 完整代码获取途径: https://github.com/liupeining/Games_101_homework 照旧把这段代码

    2024年02月04日
    浏览(40)
  • 【GAMES101】03 Transformation

    1、Scale(缩放)  2、Reflection Matrix(反射矩阵)  3、Shear Matrix(剪切矩阵)  4、Rotation Matrix(旋转矩阵) 推导过程:     5、Translation Matrix(平移矩阵) 平移操作不属于线性变换的范畴。 引入 齐次坐标 ,通过增加维度,来将平移坐标写成同样的矩阵形式。 很显然,平移无

    2024年02月02日
    浏览(43)
  • games101 作业3

    1.项目才打开时无法运行。 解决方法: 切换成c++17 解决方法引用: Games101 作业3 环境问题 - 知乎  注:知乎里面的关于越界限制的控制不适用,虽然可以解决部分作业的问题,但是在bump里面依然会出现越界错误。应该用以下大佬的代码。  2.出现越界错误   解决方法: 在头

    2023年04月25日
    浏览(38)
  • GAMES101 作业1

    作业pa1对应的是GAMES101课程Lecture02到Lecture04这三节课的内容,主要是用于巩固空间中的物体投影到相机平面的整个过程。 说在前面,本文是在左手系下进行讨论的。 粗略地看一遍我们可以知晓main函数的流程: ①设定一些基本的初始参数并初始化源代码给出的 光栅化类raste

    2024年02月09日
    浏览(34)
  • GAMES101 作业0

    课上提供的环境是Linux, 还需要安装Vitrual Box和创建虚拟机,省事就直接在Windows系统下Visual Studio下操作了。 简单的环境配置: 下载Eigen 的库 在工程属性中添加目录: 2处地方 注意: 刚添加完后,我新建main.cpp后, 引入头文件 路径也没有设置错啊,但是就是找不到。 直到看

    2024年02月16日
    浏览(41)
  • GAMES101作业2

    在屏幕上画出一个实心三角形, 换言之,栅格化一个三角形。上一次作业中,在视口变化之后,我们调用了函数 rasterize_wireframe(const Triangle t)。但这一次,你需要自己填写并调用 函数 rasterize_triangle(const Triangle t)。 该函数的内部工作流程如下: 创建三角形的 2 维 bounding box。

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包