主题:版内有对计算机图形学(openGL)比较了解的高手吗? -- 博客南
想请教openGL实现中一些算法的原理,比如纹理映射、矩阵变换之类的原理!
这些属于基础内容, 那本书上都讲的很清楚
我需要的是对opengl implementation了解的专业人士
纹理映射, 矩阵变换, 都是computer graphics里的最基础部分, 那本书里都有.
Opengl的具体实现里用了什么算法,看API reference book 也能明白个大概, 都有介绍.
还是不明白想问啥?
不管最终能不能解决问题,在这里与大家讨论说不定也能对你有所启发
这里就是这样一个开放、宽容的氛围
之前简单使用过opengl,现在深入到实现的细节,感觉难度很大。理论方面的书正在看,但和实现不太容易结合起来。
比如:
顶点坐标到光栅化后的平面坐标所经历了哪些步骤,这期间颜色、光照和纹理是如何映射到二维坐标点的?
颜色、光照和纹理对顶点的影响顺序是什么?
顶点为什么有法向量,这个顶点法向量如果和由顶点组成的平面的法向量不同,光照在这个顶点附近应该如何处理?
纹理映射如何处理和屏幕分辨率间的关系?两者不匹配会出现画面模糊的现象。
还遇到个矩阵变换方面的小问题。在二维平面上,x轴水平向右,y轴垂直向下。一左上角位于(0,0),右下角位于(1,1)的平面,如何使用(二维)齐次坐标系(3X3)实现垂直绕y轴或x轴的旋转?(相当于空间中绕y轴或x轴的旋转,但这里没有z轴的概念)
目前遇到的问题太多,以至于不知该问什么问题了,概括来说就是想问:从程序员角度,primitivies是如何在opengl状态机中流动的,在各个阶段分别被进行了哪些操作。
介绍一本书:
Wesley 出版的 Introduction to Computer Graphics
作这是 Foley, Van Dam, Feiner, Hughes, 和 Phillips
这本书把 Computer Graphics 背景和基础知识介绍得非常非常非常详细,浅显易懂,初学者可以看看.
建议仔细读一读 graphics pipeline, 可以去wikipedia看, 也可以google一下相关文章.
后面几个问题涉及一些基本概念, 还是建议自己去书上找答案, 可能自己搞懂了会比较有印象.
提示1, 有关法向量, 如果想表示曲面怎么办?
提示2, 有关齐次次变换, 请想象一下一个平面上的物体, 如果绕x轴或者y轴转一下, 再投影回平面上, 看上去象发生了什么?
这里胡扯几句,说错了莫怪。所有这些,都是假定光线跟踪的前提,未必是OpenGL里面实际的实现,但是应该差不多。
顶点坐标到光栅化,这个是有一个视觉模型在里面的。就是假定屏幕是一个光栅,从眼睛(点)出发,视线逆光线而行,经过每个像素,接触到场景中的物体,在接触点视线获取颜色和亮度。注意从光栅(二维)到场景(三维)的转化,就是这里发生的。
对于场景中的一个点来说,这个点对于视线(逆光线)有颜色和亮度的贡献,这个颜色取决于该点的颜色,而该点的颜色,或者是定义的简单颜色,或者是纹理文件映射到这个点的颜色。当时做的是透明物体,也就是说,该点的颜色和亮度,是视线在该点,经过反射和折射以后,积累的颜色。通俗的说:场景中有一杯绿色的酒,透过酒看到墙上周慧敏的图片,那么就是看到一个绿色的周姐姐。在某些地方,因为场景中灯光的照射,只能看到一个亮点,没有颜色。
顶点的法向量,我们当时的用处是用来生产贝塞尔曲面,也就是说,一个曲面由多个顶点定义,但是这个曲面并非多个小平面构成,而是由算法生成的曲面。其实如果是多个小平面的话,每个顶点都同时属于几个小平面,光照的反射折射要用接触点的法向量来决定,而非顶点的法向量。无论曲面还是小平面集合,都应该是以接触点的法向量来决定反射和折射。
纹理映射和屏幕分辨率的确是个好玩的事情,其实任何两个网格叠加,结果都是很好玩的。搜索一下Moire-fringe,莫尔条纹。
另外,多谢河里各位的投票,老叫花现在已经认证了。
就是把用多边形(实际内部都为三角形)定义的三维模型投影到视平面,然后每个三角形分别渲染。现在的主流显卡支持图形处理器编程,渲染方式也已变得多种多样,不过都还是基于三角形的。
不大有人关注这个方向。你实际问的是OpenGL流水线的实现。看红宝书没有大用,红宝书讲的是用法,从外部看OpenGL这个状态机。看图形学理论也没有直接用处,间接帮助是有的,你必须先看过,数学上保证没有疑问。
一个办法是读OpenGL源码,比如开源的mesa,如果有功夫,是值得做得。
另一个办法,我建议你关注以下方向,以及相关人群的论文。
1、显卡3D驱动开发。这批人要把部分计算弄到硬件上去,所以必须非常熟悉OpenGL内部,或者Direct3D内部,道理一样。
2、GPU编程,包括图形计算和GPGPU。这些人也必须了解OpenGL内部,才能吧shader用好。这方面热,书很多,很可能你能找到解决你问题的。但好像热不久了,CUDA出来了。
3、其他相关研究,比如搞并行的,也需要剖析OpenGL内部
,你可以搜索一下WireGL、PixelFlow、InfiniteReality等经典系统。有一篇论文讲大源头的,可惜我一下子记不起来,可以帮助了解整体的工作构架。
大的来说,分为两步,第一步处理数据为float,第二步为int。第一步笼统称为几何运算,坐标转换、光照等等,都在这里了。每个三角形映射到屏幕,带有颜色等属性。第二步笼统称为光栅化,对屏幕三点之间的区域进行两步插值,算alpha,纹理合成,等等。
系统细节很多。搞清楚有很大好处,以后往各个方向发展都游刃有余。不夸张地说,花一年搞清楚你提的问题,能增加很多工作机会。
现在,大概往GPU方向找文献希望比较大。
一个是三角形利于GPU的并行处理,因为都是一样的计算,而且各个三角形之间的数据依赖不多,非常适合并行处理。
还有一个就是从OpenGL的API来看,对多面体的描述,也多是基于三角形的。作为OpenGL API的简化版本,iphone的OpenGL API也是继承了三角形的表面描述,对其他更加复杂的多面体描述则放弃了一些。
另外OpenGL也有视觉模型,我想具体实现起来,应该也是用这个视觉模型来做从三维到屏幕光栅的映射。
至于最后物体表面的光照如何实现,那就看具体的实现了。应该不是用ray tracing,因为ray tracing还是有很多数据依赖,不适合并行计算。所以在不需要非常强的真实感的时候,比如游戏,就可以简化计算,在真实感上面折中,来换取计算速度和能量消耗。