西西河

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

共:💬26 🌺18 新:
全看树展主题 · 分页 下页
家园 版内有对计算机图形学(openGL)比较了解的高手吗?

想请教openGL实现中一些算法的原理,比如纹理映射、矩阵变换之类的原理!

家园 建议随便找本computer graphics的书

这些属于基础内容, 那本书上都讲的很清楚

家园 呵呵,随便找本书可解决不了我的问题

我需要的是对opengl implementation了解的专业人士

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

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

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

还是不明白想问啥?

家园 说出来讨论讨论吧

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

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

家园 找一本红宝书看看。

外链出处

家园 最近在学习android中opengles的实现

之前简单使用过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轴转一下, 再投影回平面上, 看上去象发生了什么?

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

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

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

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

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

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

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

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

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

家园 问的问题比较专业了

不大有人关注这个方向。你实际问的是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还是有很多数据依赖,不适合并行计算。所以在不需要非常强的真实感的时候,比如游戏,就可以简化计算,在真实感上面折中,来换取计算速度和能量消耗。

家园 出一道题:几何转换用齐次矩阵描述的原因何在?
全看树展主题 · 分页 下页


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

Copyright © cchere 西西河