OpenGL:渲染的基础

OpenGL渲染流程解析

  • attrubutes 属性只可传给 Vertex Shader(顶点着色器)
  • 通过顶点着色器Primitive(几何图元) 传递 PositionOuts
  • 可以通过 OpenGl API 向顶点着色器或者片元着色器
  • Texture Data(纹理数据)也可以同时传递给顶点着色器和片元着色器,但是真正用它的是片元着色器。

正投影

透视投影

GLFrustum 类通过SetPerspective 方法为我们构建一个平截头体。

GLFrustum:SetPerspective(float fFov,float fAspect,float fNear,float fFar):

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

  • fAspect:窗口的宽度与高度的纵横比

  • fNear:近裁剪面距离

  • fFar:远裁剪面距离

    纵横比 = 宽(w)/高(h)

OpenGL固定着色器

  • 存储器初始化

    // 定义
    GLShaderManager        shaderManager;
    // 构造
    shaderManager.InitializeStockShaders();
  • 单元着色器

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

    参数1: 存储着⾊器种类-单元着⾊器
    参数2: 颜⾊
    使⽤场景: 绘制默认OpenGL 坐标系(-1,1)下图形. 图形所有⽚段都会以⼀种颜⾊填充 
  • 平面着色器

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

    参数1: 存储着⾊器种类-平⾯着⾊器
    参数2: 允许变化的4*4矩阵
    参数3: 颜⾊
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化).
  • 上色着色器

    GLShaderManager::UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

    参数1: 存储着⾊器种类-上⾊着⾊器
    参数2: 允许变化的4*4矩阵
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 颜⾊将会平滑地插⼊到顶点之间称为平滑着⾊. 
  • 默认光源着色器

    GLShaderManager::UserStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]);

    参数1: 存储着⾊器种类-默认光源着⾊器
    参数2: 模型4*4矩阵
    参数3: 投影4*4矩阵
    参数4: 颜⾊值
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.
  • 点光源着色器

    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: 颜⾊值
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化) 这种着⾊器会使绘制的图形产⽣阴影和光照的效果.它与默认光源着⾊器⾮常类似,区别只是光源位置可能是特定的
  • 纹理替换矩阵着色器

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

    参数1: 存储着⾊器种类-纹理替换矩阵着⾊器
    参数2: 模型4*4矩阵
    参数3: 纹理单元
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵.使⽤纹理单元来进⾏颜⾊填充.其中每个像素点的颜⾊是从纹理中获取.
  • 纹理调整着色器

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

    参数1: 存储着⾊器种类-纹理调整着⾊器
    参数2: 模型4*4矩阵
    参数3: 颜⾊值
    参数4: 纹理单元
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个基本⾊乘以⼀个取⾃纹理单元nTextureUnit 的纹理.将颜⾊与纹理进⾏颜⾊混合后才填充到⽚段中. 
  • 纹理光源着色器

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

    参数1: 存储着⾊器种类-纹理光源着⾊器
    参数2: 模型4*4矩阵
    参数3: 投影4*4矩阵
    参数4: 点光源位置
    参数5: 颜⾊值(⼏何图形的基本⾊) 
    参数6: 纹理单元
    使⽤场景: 在绘制图形时, 可以应⽤变换(模型/投影变化)这种着⾊器通过给定的模型视图投影矩阵. 着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘). 

以上整理出部分固定着色器,在后面我们可能会针对性的用到,这些不用记,只需要了解即可,知道怎么用即可。

OpenGL基本图元

OpenGL中的基本图元就是线三角形等构成所有的图形,在这些基本元素组合中又抽象出一些基本图元,如上图所示。

  • GL_POINTS :每个顶点都在屏幕上都是单独的点

  • GL_LINES:每一对顶点定义一个线段

  • GL_LINE_LOOP:和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了

  • GL_TRIANGLES:每3个顶点定义一个新的三角形

  • GL_TRIANGLE_STRIP:公用一个条带(strip)上的顶点的一组三角形

  • GL_TRIANGLE_FAN:以一个圆点为中心呈扇形排列,公用相邻顶点的一组三角形

OpenGL中的点和线

//1.最简单也是最常⽤的 4.0f,表示点的⼤⼩
 glPointSize(4.0f); 

//2.设置点的⼤⼩范围和点与点之间的间隔
GLfloat sizes[2] = {2.0f,4.0f}; 
GLfloat step = 1.0f

//3.获取点⼤⼩范围和最⼩步⻓
glGetFloatv(GL_POINT_SIZE_RANGE ,sizes); 
glGetFloatv(GL_POINT_GRAULARITY ,&step); 

//4.通过使⽤程序点⼤⼩模式来设置点⼤⼩
glEnable(GL_PROGRAM_POINT_SIZE); 

//5.这种模式下允许我们通过编程在顶点着⾊器或⼏何着⾊器中设置点⼤⼩。着⾊器内建变量:
gl_PointSize(内建变量),并且可以在着⾊器源码直接写
gl_PointSize = 5.0 

//6. 设置线段宽度
glLineWidth(2.5f);

OpenGL工具类GLBatch

GLBatch ,是在GLTools中包含的⼀个简单容器类. 
void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0); 

参数1:图元
参数2:顶点数
参数3:⼀组或者2组纹理坐标(可选)

//复制顶点数据(⼀个由3分量x,y,z顶点组成的数组) 
void GLBatch::CopyVerterxData3f(GLfloat *vVerts); 
//复制表⾯法线数据
void GLBatch::CopyNormalDataf(GLfloat *vNorms); 
//复制颜⾊数据
void GLBatch::CopyColorData4f(GLfloat *vColors); 
//复制纹理坐标数据
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer); 
//结束数据复制
void GLBatch::End(void); 
//绘制图形
void GLBatch::Draw(void);

至此,OpenGL渲染的基础我们总结完毕,包含其渲染架构,以及部分的固定着色器、OpenGL的基本图元构成,以及GLBatch的定义和使用。

------------- 本文结束  感谢您的阅读 -------------