西西河

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

共:💬26 🌺18 新:
全看树展主题 · 分页 上页
家园 謝謝回復

提問時表達不清,我想了解的的確是OpenGL流水线的实现。當時對于OpenGl流水線各部分有些模糊的理解,但無法從頭至尾把他們串在一起,因此想找對此了解的河友解惑。

參考93年sgi的opengl實現,自我感覺現在差層窗戶紙,點不透,有點郁悶,呵呵。不過最近也沒怎么關注了,用到再說吧。

家园 ray casting用的更多一些,大部分顯卡目前都用的

ray casting用的更多一些,大部分顯卡目前都用的這種算法。ray tracing計算量太大,上半年聽說美國一家公司搞出了支持ray tracing的顯卡,每秒4~6幀,很快了已經。

家园 是為了矩陣計算方便吧

幾種變化只是特定矩陣元素的變化,可以把復雜的動作分為幾個簡單的動作的組合。這個還真沒考慮過,只知道這樣方便。

家园 是为了描述硬件实现

用矩阵,看起来好看一点,但数学上其实是等价的。三维坐标转换的问题,几何学上极简单,完全没有复杂到非用矩阵不可。

但为什么教材里都用矩阵?

下面就是我猜的了。在硬件实现上,把16个参数设置好,每过来一个点,一个脉冲,输出结果。无论简单的变换还是复杂的变换,硬件做死了,都是这么一下。这个结构很适合矩阵描述。

硬件设计的术语、模式回过头来渗透到理论里。而写理论、教理论的人已经习惯,无察觉了。

比如你的话,“primitive在状态机里的流动”,对于一个纯软件版本的OpenGL是完全没有意义的。CPU指令顺序执行,哪有什么流动的问题。在硬件上,就是显卡上,就不一样了,一个点做完transformation,送到下一级做lighting,然后立即开始下一个点的transformation。一个时钟脉冲下多个点同时在处理。

这一块图形学有一些术语模糊,是一个特点。

家园 这个这个,是理论在前吧

记得当年实现光线跟踪的时候,只有286机器,所有的矩阵变换都是手写的循环。但是那个时候教科书上面已经使用齐次坐标来表述了。当时虽然有vector machine,但是还没有专门为图形加速的硬件。

后来看到intel的mmx/sse指令,简直内牛满面啊,这简直就是专门为3维变换量身定做的向量乘加指令。AMD就更直接了,干脆管新的向量指令叫3D Now!

图形的确很适合并行处理,无论是向量的各个计算这样的细节,还是每个像素的计算,都可以大规模并行。这个时候就是只恨芯片的data path不够宽了。

家园 大概说几句

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

定点, 就是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,这东西不下功夫从头看是明白不了的

希望有帮助

家园 用矩阵并不是因为硬件

矩阵作为数学工具应用于几何变换在各种数学理论里早已有之,远远早于计算机的发明,跟计算机硬件没有直接关系。用矩阵运算可以简化各种变换的合成和分解,不用矩阵很难作。

另外OPENGL状态机只是逻辑上的,并不一定直接映射到硬件操作。所以楼主说得没有错,这是个逻辑上的说法,具体实现另当别论。

家园 1、表述。2、流动。
家园 有理。花一个。
家园 不太明白

这两个词有问题吗?矩阵表述是数学里的常用法,在状态机里流动是一个逻辑上的说法而已

家园 找美人她爹

找美人她爹,第一个问题已经澄清,我猜错了。

第二个问题,OpenGL pipeline,中文翻译成流水线。离开硬件流水线设计这个语境,“流动”没什么意义,或者只是一个普通的比喻。

状态机是另一回事,联系到OpenGL用户接口的设计,由于算法的复杂性,不得不设置一大堆开关。

术语混乱,表现在

OpenGL = OpenGL状态机 =OpenGL流水线

经常混用。

把OpenGL就死死地定义成一个C程序,我发现是个好的基础,很有助于理解。

大概是我联想过度了,本能。但是想一想,OpenGL只是一个普通C程序,驱动开发者向组织交少量钱就可以买到这个程序。为什么谈其他C程序我们不大用“流动”这个词,对OpenGL就不由自主用上了“流动”这个词。是不是受了“流水线”这个词的影响。

全看树展主题 · 分页 上页


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

Copyright © cchere 西西河