zoukankan      html  css  js  c++  java
  • Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)

    写在前面的废话:

      这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习。。感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始。

    正文开始:

     首先Graphics Pipeline只接收一系列的3D坐标(x,y,z)但是每个使用者的屏幕又只能显示2D像素,比如我的显示器的分辨率(2880X1440)仅仅只存在x和y轴即长和宽。所以我们的opengl 通过接收过来的3D数据会通过Graphics Pipeline转换成有色2D屏幕上的数据。——————Graphics Pipeline的大体作用。

       接下来我们来看看它究竟是由哪几部分组成的吧,首先Graphics Pipeline的输入为一个数组(顶点数组 vertex data)其中包含了之前所提到的3D坐标之后会有例子提供。然后这组数据先进入了第一阶段顶点着色器( Vertex Shader可编辑也是必须编辑,之后单独解释)接下来大家想象流水线是如何工作的,是不是上一个阶段完成后,所产出的东西继续回到流水线上然后面的阶段再做加工? 渲染流水也是如此, 从顶点着色器出来的数据是被加工过的,即顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理,然后作为输入传递给了形状(图元)装配阶段(Shape Assembly)。

        插嘴补一句:这里引入了一个新的概念 图元, 很简单我们之前只是传入了一系列的点,我们的opengl并不知道我们想要我们怎么解释这些点存在的意义,说人话就是它还不知道我们想让这些点如何连接?画成线?点?还是三角形? 所以这里我们通过所谓的图元来告诉它该怎么画。tips:图元的选择可以有这么几种    GL_POINTSGL_TRIANGLESGL_LINE_STRIP

        继续,从Shape Assembly阶段出来的数据,又进入了几何着色器(Geometry Shader可编辑但是不必须编辑),这个阶段所做的事情很神奇目前我还不是很理解,大概他的意思是能够生成新的顶点然后随之产生新的图元,注意这时候的图元可能与我们之前在Shape Assembly阶段所要设置的图元可能不同,然后由此产生新的图形。

        接下来,集合着色器的输出会作为输入 传递给下一阶段,光栅化阶段(Rasterization Stage),这个阶段所做的事情目前任然超出了我的理解范围,大致在这里它会把图元映射为最终屏幕上相应的像素,生成供段着色器(Fragment Shader)使用的片段(Fragment)并且在这之后他会对裁切一部分,使得在视野之外的片段不用进入到片段着色器去上色,从而提高了整体渲染效率。

        插嘴补一句:渲染一个像素点所需要的全部数据在opengl中叫一个片段。 即一个片段对应一个像素点。

       当产生的片段进入了片段着色器(Fragment Shader可编辑也是必须编辑)后,它根据所提供的片段数据计算该像素点最终的颜色。 这里注意,并不一定是在片段中我们规定的颜色,由于游戏图形中会收到光的颜色,阴影,光照方向强度等影响,最终所显示在屏幕上的颜色会与我们设置的颜色有些不同,但这些都将在片段着色器中设置。

       接下来,当最终像素点颜色确定后,最终的图形将会被传递给我们叫做Alpha测试和混合(Blending)阶段。 们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

      就我目前的水平而言 最后两个阶段还不能完全理解,以上是一些自己的体会和见解,如果有大佬看到有哪些地方存在偏差或错误请直接在评论区指出!这是对我来说十分珍贵的学习机会希望大佬们不吝赐教!!

  • 相关阅读:
    STM32的串口DMA收发以及双缓冲区的实现
    平衡二叉树
    二叉树的深度
    3D数学基础(四)四元数和欧拉角
    3D数学基础(三)矩阵
    3D数学基础(二)向量
    3D数学基础(一)Unity坐标系
    快速学会开发微信小程序
    苦逼的程序员
    开通博客,在这个年末,重新开始。
  • 原文地址:https://www.cnblogs.com/LuoRuidiLoveMiku/p/11273401.html
Copyright © 2011-2022 走看看