五千年(敝帚自珍)

主题:版内有对计算机图形学(openGL)比较了解的高手吗? -- 博客南

共:💬26 🌺18
全看分页树展 · 主题 跟帖
家园 大概说几句

看了你的问题和一些回复,随便说几句

定点, 就是vertex是个三维笛卡尔坐标系的点,用一个四维坐标来表达,比如(x,y,z,1),最后一个一定是1,这就是所谓的齐次坐标.如果是向量,就是(x,y,z,0),最后一定是个0.说白了,简单的理解,第四个坐标值就是用来区别向量和点的.一个向量空间(三个坐标轴向量)加一个远点就可以定义一个三维空间,所有这个空间中的点和向量都可以定义了.

假设有一个三角形,它的三个定点如果显示在屏幕上,坐标值大概经历的pipeline如下:

object space->world space -> view space->screen space

前三个还是三维坐标,最后一个是屏幕的二维坐标,只有xy.

最后一个转换会经历perspective 变换,那是个难点,要好好研究.

你说的那个旋转问题,设计一个二维旋转矩阵,2X2的就好了,因为已经到了screen space,齐次坐标没啥用了,可以直接二维旋转就行了.网上搜一下就有现成的.

在GPU里面, 这些坐标转换都是在vertex shader里实现的.对每个三角形的三个定点分别完成转换, 面片上的点根据其 barycentric 坐标值做interpolation,就得到了具体的值.

这样之后,得到的是一个fragment,跟具体一个pixel可能不是一一对应的,一般叫做aliasing , 你玩游戏的时候看到什么防锯齿化就是为了消除这个问题.

pixelshader就是针对上面生成的pixel/fragment来操作,主要是完成光照和texture mapping, 以及所有杂七杂八的后续操作,目的就是增加视觉效果.这个时候,normal vector,就是法向量,会用到来计算光强.texture coordinate用来访问texture image,访问的时候加各种filter或者interpolation的操作来避免aliasing. 这里normal和texture coordinate 也已经根据面片自动做了interpolation,变成了针对每个pixel/fragment了

大概就这些,建议看一本graphics的基础书籍,然后读一些GPU的shader,这东西不下功夫从头看是明白不了的

希望有帮助

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河