西西河

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

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

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

    • 家园 介绍一本书

      介绍一本书:

      Wesley 出版的 Introduction to Computer Graphics

      作这是 Foley, Van Dam, Feiner, Hughes, 和 Phillips

      这本书把 Computer Graphics 背景和基础知识介绍得非常非常非常详细,浅显易懂,初学者可以看看.

    • 家园 找一本红宝书看看。

      外链出处

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

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

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

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

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

          之前简单使用过opengl,现在深入到实现的细节,感觉难度很大。理论方面的书正在看,但和实现不太容易结合起来。

          比如:

          顶点坐标到光栅化后的平面坐标所经历了哪些步骤,这期间颜色、光照和纹理是如何映射到二维坐标点的?

          颜色、光照和纹理对顶点的影响顺序是什么?

          顶点为什么有法向量,这个顶点法向量如果和由顶点组成的平面的法向量不同,光照在这个顶点附近应该如何处理?

          纹理映射如何处理和屏幕分辨率间的关系?两者不匹配会出现画面模糊的现象。

          还遇到个矩阵变换方面的小问题。在二维平面上,x轴水平向右,y轴垂直向下。一左上角位于(0,0),右下角位于(1,1)的平面,如何使用(二维)齐次坐标系(3X3)实现垂直绕y轴或x轴的旋转?(相当于空间中绕y轴或x轴的旋转,但这里没有z轴的概念)

          目前遇到的问题太多,以至于不知该问什么问题了,概括来说就是想问:从程序员角度,primitivies是如何在opengl状态机中流动的,在各个阶段分别被进行了哪些操作。

          • 家园 大概说几句

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

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

            希望有帮助

          • 家园 出一道题:几何转换用齐次矩阵描述的原因何在?
            • 家园 是為了矩陣計算方便吧

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

              • 家园 是为了描述硬件实现

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

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

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

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

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

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

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

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

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

                  • 家园 1、表述。2、流动。
                    • 家园 不太明白

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

                      • 家园 找美人她爹

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

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

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

                        术语混乱,表现在

                        OpenGL = OpenGL状态机 =OpenGL流水线

                        经常混用。

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

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

分页树展主题 · 全看 下页


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

Copyright © cchere 西西河