西西河

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

共:💬26 🌺18 新:
分页树展主题 · 全看 上页
                • 家园 这个这个,是理论在前吧

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

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

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

          • 家园 问的问题比较专业了

            不大有人关注这个方向。你实际问的是OpenGL流水线的实现。看红宝书没有大用,红宝书讲的是用法,从外部看OpenGL这个状态机。看图形学理论也没有直接用处,间接帮助是有的,你必须先看过,数学上保证没有疑问。

            一个办法是读OpenGL源码,比如开源的mesa,如果有功夫,是值得做得。

            另一个办法,我建议你关注以下方向,以及相关人群的论文。

            1、显卡3D驱动开发。这批人要把部分计算弄到硬件上去,所以必须非常熟悉OpenGL内部,或者Direct3D内部,道理一样。

            2、GPU编程,包括图形计算和GPGPU。这些人也必须了解OpenGL内部,才能吧shader用好。这方面热,书很多,很可能你能找到解决你问题的。但好像热不久了,CUDA出来了。

            3、其他相关研究,比如搞并行的,也需要剖析OpenGL内部

            ,你可以搜索一下WireGL、PixelFlow、InfiniteReality等经典系统。有一篇论文讲大源头的,可惜我一下子记不起来,可以帮助了解整体的工作构架。

            大的来说,分为两步,第一步处理数据为float,第二步为int。第一步笼统称为几何运算,坐标转换、光照等等,都在这里了。每个三角形映射到屏幕,带有颜色等属性。第二步笼统称为光栅化,对屏幕三点之间的区域进行两步插值,算alpha,纹理合成,等等。

            系统细节很多。搞清楚有很大好处,以后往各个方向发展都游刃有余。不夸张地说,花一年搞清楚你提的问题,能增加很多工作机会。

            现在,大概往GPU方向找文献希望比较大。

            • 家园 謝謝回復

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

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

          • 家园 老叫花不才,14年前曾经底层实现过光线跟踪

            这里胡扯几句,说错了莫怪。所有这些,都是假定光线跟踪的前提,未必是OpenGL里面实际的实现,但是应该差不多。

            顶点坐标到光栅化,这个是有一个视觉模型在里面的。就是假定屏幕是一个光栅,从眼睛(点)出发,视线逆光线而行,经过每个像素,接触到场景中的物体,在接触点视线获取颜色和亮度。注意从光栅(二维)到场景(三维)的转化,就是这里发生的。

            对于场景中的一个点来说,这个点对于视线(逆光线)有颜色和亮度的贡献,这个颜色取决于该点的颜色,而该点的颜色,或者是定义的简单颜色,或者是纹理文件映射到这个点的颜色。当时做的是透明物体,也就是说,该点的颜色和亮度,是视线在该点,经过反射和折射以后,积累的颜色。通俗的说:场景中有一杯绿色的酒,透过酒看到墙上周慧敏的图片,那么就是看到一个绿色的周姐姐。在某些地方,因为场景中灯光的照射,只能看到一个亮点,没有颜色。

            顶点的法向量,我们当时的用处是用来生产贝塞尔曲面,也就是说,一个曲面由多个顶点定义,但是这个曲面并非多个小平面构成,而是由算法生成的曲面。其实如果是多个小平面的话,每个顶点都同时属于几个小平面,光照的反射折射要用接触点的法向量来决定,而非顶点的法向量。无论曲面还是小平面集合,都应该是以接触点的法向量来决定反射和折射。

            纹理映射和屏幕分辨率的确是个好玩的事情,其实任何两个网格叠加,结果都是很好玩的。搜索一下Moire-fringe,莫尔条纹。

            另外,多谢河里各位的投票,老叫花现在已经认证了。

            • 家园 OPEN GL 用的不是光线跟踪,是分三角形渲染

              就是把用多边形(实际内部都为三角形)定义的三维模型投影到视平面,然后每个三角形分别渲染。现在的主流显卡支持图形处理器编程,渲染方式也已变得多种多样,不过都还是基于三角形的。

              • 家园 看过一点关于这方面的皮毛

                一个是三角形利于GPU的并行处理,因为都是一样的计算,而且各个三角形之间的数据依赖不多,非常适合并行处理。

                还有一个就是从OpenGL的API来看,对多面体的描述,也多是基于三角形的。作为OpenGL API的简化版本,iphone的OpenGL API也是继承了三角形的表面描述,对其他更加复杂的多面体描述则放弃了一些。

                另外OpenGL也有视觉模型,我想具体实现起来,应该也是用这个视觉模型来做从三维到屏幕光栅的映射。

                至于最后物体表面的光照如何实现,那就看具体的实现了。应该不是用ray tracing,因为ray tracing还是有很多数据依赖,不适合并行计算。所以在不需要非常强的真实感的时候,比如游戏,就可以简化计算,在真实感上面折中,来换取计算速度和能量消耗。

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

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

          • 家园 简单回几句

            建议仔细读一读 graphics pipeline, 可以去wikipedia看, 也可以google一下相关文章.

            后面几个问题涉及一些基本概念, 还是建议自己去书上找答案, 可能自己搞懂了会比较有印象.

            提示1, 有关法向量, 如果想表示曲面怎么办?

            提示2, 有关齐次次变换, 请想象一下一个平面上的物体, 如果绕x轴或者y轴转一下, 再投影回平面上, 看上去象发生了什么?

        • 家园 说出来讨论讨论吧

          不管最终能不能解决问题,在这里与大家讨论说不定也能对你有所启发

          这里就是这样一个开放、宽容的氛围

        • 家园 如果问原理, 需要看教科书

          纹理映射, 矩阵变换, 都是computer graphics里的最基础部分, 那本书里都有.

          Opengl的具体实现里用了什么算法,看API reference book 也能明白个大概, 都有介绍.

          还是不明白想问啥?

分页树展主题 · 全看 上页


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

Copyright © cchere 西西河