OpenGL渲染基础架构

导语:

渲染管线(渲染流水线),一般由显示芯片(GPU)内部处理图形信号的并行处理单元组成。这些并行处理单元两两之间互相独立。不同的型号硬件上独立处理单元的数量有很大差别。与CPU串行执行不同,渲染管线中的各个处理单元并行处理,渲染效率可以得到极大地提升。

  • 1、渲染管线

    1.1、渲染管线流程图:

    image.png

      1.1.1、基本处理:

        该阶段设定3D空间中物体的顶点坐标、顶点对应颜色、顶点的纹理坐标等属性。并且指定绘制方式:点绘制、线绘制、三角形绘制。

      1.1.2、顶点缓冲区

        这部分功能在程序中是可选的,但是一般情况下,都要使用,不为别的,主要为了提高GPU的IO带宽和性能优化,使用的情况为输入的顶点数据基本没有变化的情况下,在初始化阶段将这些顶点输入到顶点缓冲区,在绘制每一帧时就可以直接从缓冲区里面拿取并使用,再也不用从cpu的存储器中进行拿取。

      1.1.3、变换和光照

        a、顶点变换任务:对3D物体的各个顶点的平移、缩放和旋转的功能。
        b、光照计算任务:根据光照的位置、性质、各通道强度,物质材质,来计算物体的各个顶点的光照情况。

      1.1.4、图元装配

        a、图元组装:顶点数据根据设置的绘制方式被结合在一起。
        b、图元处理:通过几个几何着色器进行对物体图形的处理,后续再进行详细介绍。

      1.1.5、光栅化

        主要用于决定哪些像素点最后可以渲染的屏幕上。

      1.1.6、纹理环境和颜色求和

        从纹理图中某个纹理坐标位置获取该位置颜色值
        根据纹理采样值和光照计算等结果生成片元的最终颜色。

      1.1.7、Alpha测试

        Alpha除了在颜色混合的时候需要用到意外,还有一个用途就是Alpha测试,Alpha测试的原理:当每个像素即将绘制时,如果启动了Alpha测试,OpenGL会检查像素的Alpha值,只有Alpha值满足条件的像素才会绘制(严格的说,满足条件的像素会通过本项测试,进行下一种测试,只有所以测试都通过,才能进行绘制),不满足条件的泽不进行绘制。这个"条件"可以设置成:始终通过,始终不通过,大于设定值则通过,小于设定值则通过,等于设定值则通过、大于等于、小于等于、不等于则通过。

        可以通过下面的代码来启用或禁用Alpha测试

    glEnable(GL_ALPHA_TEST);  // 启用Alpha测试
    glDisable(GL_ALPHA_TEST); // 禁用Alpha测试
    

        可以通过下面的代码来设置Alpha测试条件为“大于0.5则通过”

    glAlphaFunc(GL_GREATER, 0.5f);
    

        该函数的第二个参数表示设定值,用于进行比较。第一个参数是比较方式,除了GL_LESS(小于则通过)外,还可以选择:
        GL_ALWAYS(始终通过),
        GL_NEVER(始终不通过),
        GL_LESS(小于则通过),
        GL_LEQUAL(小于等于则通过),
        GL_EQUAL(等于则通过),
        GL_GEQUAL(大于等于则通过),
        GL_NOTEQUAL(不等于则通过)。

      1.1.8、裁剪测试

        裁剪测试用于限制绘制区域,当开启裁剪测试,只有没有被裁剪的窗口内的像素点会绘制,其他像素不在窗口内的则都不会绘制
        可以通过下面的代码来启用或禁用剪裁测试:

    glEnable(GL_SCISSOR_TEST);  // 启用剪裁测试
    glDisable(GL_SCISSOR_TEST); // 禁用剪裁测试
    

        可以通过下面的代码来指定一个位置在(x, y),宽度为width,高度为height的剪裁窗口

    glScissor(x, y, width, height);
    

        \color{red}{注意:OpenGL窗口坐标是以左下角为(0, 0), 右上角为(width, height)的}

      1.1.9、深度测试

        深度测试,就是对深度缓冲区内的像素深度值与新值进行比较,来判断是否通过测试,这样在渲染图形的时候,无线考虑图形中图形渲染顺序问题。

        通过glEnable/glDisable函数可以启用或禁用深度测试

    glEnable(GL_DEPTH_TEST);  // 启用深度测试
    glDisable(GL_DEPTH_TEST); // 禁用深度测试
    

        至于通过测试的条件,同样有八种。条件设置是通过glDepthFunc函数完成的,默认值是GL_LESS。

    glDepthFunc(GL_LESS);
    

    除了GL_LESS(小于则通过)外,还可以选择:
    GL_NEVER,不通过(输入的深度值不取代参考值)
    GL_LESS,如果输入的深度值小于参考值,则通过
    GL_EQUAL,如果输入的深度值等于参考值,则通过
    GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过
    GL_GREATER,如果输入的深度值大于参考值,则通过
    GL_NOTE_QUAL,如果输入的深度值不等于参考值,则通过
    GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过
    GL_ALWAYS,总是通过(输入的深度值取代参考值)

  • 2、渲染管线

    2.1、着色器:
        概念:着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。
        2.1.1 顶点着色器
          其工作过程为首先将原始的顶点几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标,颜色,点位置等后续流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。
    image.png

        顶点着色器的输入包括:
          着色器程序——描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。
          属性变量(attribute)——用顶点数组提供的每个顶点的数据。
          统一变量(uniform)——顶点着色器使用的不变数据。
          采样器——代表顶点着色器使用纹理的特殊统一变量类型。
          顶点着色器的输出包括:
            内建输出变量——例如gl_Position,经过变换矩阵变换后的顶点最终位置。
            易变变量(varying)——从顶点着色器计算产生并传递给片元着色器的数据变量。

    2.1.2 片元着色器
      片元着色器是用于处理片元值及其相关数据的可编程单元,其可以执行纹理的采样,颜色的汇总,计算雾颜色等操作,每片元执行一次。片元着色器主要功能为通过重复执行(每片元一次),将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后继阶段。


image.png

    片元着色器的输入包括:
      易变变量(varying)—从顶点着色器传递到片元着色器的易变变量数据。
片元着色器的输出包括:
      gl_FragColor ——计算后的片元颜色,一般在片元着色器的最后都会对gl_FragColor 进行赋值。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容