zoukankan      html  css  js  c++  java
  • OpenGL 三

    一、OpenGL的渲染流程架构

    三种渲染管线的传递方式:attribute(属性)、texture(纹理) 、uniform(统一)

    图元装配(primitive assembly):下图 "OpenGL 基本图元" 的9中图元链接方式。

    片元着色器 --> 逐个片元(片段)操作 --> 帧缓冲区 --> render 显示器

     二、简单使用 

    1)正投影 2D

      GLFrumstum::SetOrthographic(GLFloat xMin,GLFloat xMax,GLFloat yMin,GLFloat yMax,GLFloat zMin,GLFloat zMax);// 大小 只要能把要看到的视图装进去就可以,具体大小并不影响。

    2)透视投影 3D

      CLFrustum::SetPerspective(float fFov , float fAspect ,float fNear ,float fFar); 

      /*  GLFrustum类通过setPerspective ⽅方法为我们构建⼀一个平截头体。 参数:

      fFov:垂直⽅方向上的视场⻆角度

      fAspect:窗⼝口的宽度与⾼高度的纵横⽐比

      fNear:近裁剪⾯面距离 fFar:远裁剪⾯面距离 

      纵横⽐比 = (w)/⾼高(h)  */

    3)存储着色器初始化 - 了解  

      // GLShaderManager 的初始化
      GLShaderManager shaderManager;
      shaderManager.InitializeStockShaders() 

    1、单元着色器 GLT_SHADER_IDENTITY

      GLShaderManager::UserStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);

      // 参数1:存储着色器种类 - 单元着色器 GLT_SHADER_IDENTITY  参数2:颜色

      // 使用场景:绘制默认OpenGL 坐标系(-1,1)下的图形,图形所有片段都会以一种颜色填充

    2、平面着色器 GLT_SHADER_FLAT

      GLShaderManager::UserStockShader(GLT_SHADER_FLAT,GLFloat mvp[16],GLfloat vColor[4]);

      // 参数1:存储着色器种类 - 平面着色器 GLT_SHADER_FLAT 参数2:允许变化的4*4矩阵 参数3:颜色

      // 使用场景:绘制图形,可以变换(模型/投影变换)

    3、上色着色器 GLT_SHADER_SHADER  

      GLShaderManager::UserStockShader(GLT_SHADER_SHADER,GLFloat mvp[16]);

      // 参数1:存储着色器种类 - 上色着色器 GLT_SHADER_SHADER 参数2:允许变化的4*4矩阵

      //  使用场景:在绘制图形时,可以应用变换(模型/投影变换) 颜色将会平滑的插入到顶点之间,称为平滑着色。

    4、默认光源着色器 GLT_SHADER_DEFAULT_LIGHT

      GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);  
      /* 参数1: 存储着色器种类-默认光源着⾊器 GLT_SHADER_DEFAULT_LIGHT 
      参数2: 模型4*4矩阵  
      参数3: 投影4*4矩阵  
      参数4: 颜⾊值 */

    使⽤用场景: 在绘制图形时, 可以应⽤用变换(模型/投影变化) 这种着色器会使绘制的图形产生阴影和光照的效果。

    5、点光源着色器 GLT_SHADER_POINT_LIGHT_DIEF

      GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
      /* 参数1: 存储着⾊色器器种类-点光源着⾊色器器
        参数2: 模型4*4矩阵  
          参数3: 投影4*4矩阵  
          参数4: 点光源的位置  
        参数5: 颜⾊色值  */

      // 使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着色器会使绘制的图形产生

    阴影和光照的效果,它与默认光源着色器⾮常类似,区别只是光源位置可能是特定的。

    6、纹理替换矩阵着色器 GLT_SHADER_TEXTURE_REPLACE

      GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);

      /* 参数1: 存储着⾊器种类-纹理理替换矩阵着⾊器 GLT_SHADER_TEXTURE_REPLACE

      参数2: 模型4*4矩阵

      参数3: 纹理单元

      // 使⽤用场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵。使⽤纹理单元来进⾏颜⾊填充,其中每个像素点的颜⾊是从纹理中获取。

    7、纹理调整着色器 GLT_SHADER_TEXTURE_MODULATE

      GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);

      /* 参数1:  存储着⾊色器器种类-纹理理调整着⾊器 GLT_SHADER_TEXTURE_MODULATE

      参数2:  模型4*4矩阵

      参数3:  颜⾊色值  

      参数4:  纹理理单元 *?

      // 使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元 nTextureUnit 的纹理.将颜⾊与纹理进行颜⾊混合后才填充到⽚段中。

    8、纹理光源着色器 GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF

      GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

      /* 参数1: 存储着⾊器种类-纹理光源着⾊器

      参数2: 模型4*4矩阵

      参数3: 投影4*4矩阵
      参数4: 点光源位置

      参数5: 颜⾊值(⼏何图形的基本色)

      参数6: 纹理单元 */

      // 使⽤场景: 在绘制图形时, 可以应用变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将一个纹理通过漫反射照明计算进⾏调整(相乘)。

    三、OpenGL基本图元连接方式

    1)OpenGL 基本图元

    OpenGL 基本图元连接方式:

    2)简单使用 - 了解

    1、OpenGL 点/线

    2、OpenGL 三角形

    对于OpenGL 光栅化最欢迎的是三⻆形。3个顶点就能构成一个三⻆形,三⻆形类型来⾃于顶点,并不是所有的三角形都是正三⻆形 

    3、OpenGL 三角形环绕方式

    OpenGL 默认为 逆时针方向环绕的多边形为正面。这就意味着图中左边是正面,右边是反面。

      glFrontFace(GL_CW);

      GL_CW: 告诉 OpenGL 顺时针环绕的多边形为正面;
      GL_CCW: 告诉 OpenGL 逆时针环绕的多边形为正⾯

    4、 OpenGL 三角形带

    对于很多表⾯或者形状⽽言,我们会需要绘制⼏个相连的三⻆形. 这是我们可以使⽤GL_TRIANGLE_STRIP 图元绘制⼀串相连三⻆形,从⽽节省⼤量的时间 

      a、⽤前3个顶点指定第1个三⻆形之后,对于接下来的每⼀个三⻆形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采用这种方法可以节省⼤量的程序代码和数据存储空间
      b、提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了

    5、OpenGL三角形扇

    对于很多表⾯或者形状⽽言,我们会需要绘制⼏个相连的三⻆形。我们可以使⽤ GL_TRIANGLE_FAN 图元绘制一组围绕一个中⼼点相连的三⻆形 

    6、OpenGL 工具类 GLBatch - 

     GLBatch - GLTool 中的一个简单容器

  • 相关阅读:
    C# 复制(深拷贝、浅拷贝)
    Nunit-Writing Tests
    Thread.Sleep vs. Task.Delay
    AutoMapper Getting started
    设计:抽象类类还是接口
    C++Primer第五版——习题答案详解(八)
    C++Primer第五版——习题答案详解(七)
    C++Primer第五版——习题答案详解(六)
    C++Primer第五版——习题答案详解(五)
    C/C++中的函数指针的使用与总结
  • 原文地址:https://www.cnblogs.com/zhangzhang-y/p/13275314.html
Copyright © 2011-2022 走看看