LearnOpenGL - 渲染基础

渲染基础


©shuan9999

1. OpenGL 渲染架构

  • 架构图:
    在这里插入图片描述
  • Client:客户端,不同于我们理解的,此处指存储在CPU存储器上,在应用程序上执行或在主系统内存执行的代码。譬如,我们写的C\C++代码。
  • Server:服务端,同样的也不是我们理解的服务器,而是GPU端,我们写的shader就是在GPU上执行。总的来说我们就是编写程序通过OpenGL库不断将我们的一些数据发送给GPU去执行。
  • Attributes、Uniforms、TextureData:是客户端向服务端传递数据的三种方式,其中Attributes表示属性,通过GLSL间接传递到顶点着色器,不能传到片元着色器,譬如:颜色数据、顶点数据、纹理坐标光照法线等经常发生变化的值。Uniforms类似一个通道,传递的数据很多,譬如:传入一个旋转矩阵到顶点着色器让整个图形发生旋转、传入一个转换矩阵到片元着色器将解码后的视频YUV颜色空间转换成RGB。Uniforms主要传递不会经常发生变化的值。TextureData表示纹理数据,也就是我们看到的图片,日常给图片加滤镜就是操作纹理。

2. OpenGL 固定管线下的常用API

GLShaderManager::InitializeStockShaders();

  • GLShaderManager 的初始化

GLFrumstum::SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin,
 GLfloat yMax, GLfloat zMin, GLfloat zMax);

  • 设置正投影

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

  • GLFrustum类通过setPerspective ⽅法为我们构建⼀个平截头体。
  • 参数:
    • fFov:垂直⽅向上的视场⻆度
    • fAspect:窗⼝的宽度与⾼度的纵横⽐
    • fNear:近裁剪⾯距离
    • fFar:远裁剪⾯距离
    • 纵横⽐ = 宽(w)/⾼(h)

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);

  • GLBatch ,是在GLTools中包含的⼀个简单容器类

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: 纹理单元
  • 使⽤场景: 在绘制图形时,可以应⽤变换(模型/投影变化),这种着⾊器通过给定的模型视图投影矩阵。着⾊器将⼀个纹理通过漫反射照明计算进⾏调整(相乘)

3. OpenGL 基本图元

绘制图形的基本单元,表示对于给定的若干顶点怎么去绘制

  • GL_POINTS

对于给定的顶点,每个在屏幕上都是单独的点,相互之间不连接

  • GL_LINES

一对顶点连接成一条线

  • GL_LINE_STRIP

将所给的顶点从第一个连接到最后一个

  • GL_LINE_LOOP

和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了

  • GL_TRIANGLES

每3个顶点定义⼀个新的三⻆形

  • GL_TRIANGLE_STRIP

共⽤⼀个条带(strip)上的顶点的⼀组三⻆形

  • GL_TRIANGLE_FAN

以⼀个圆点为中⼼呈扇形排列,共⽤相邻顶点的⼀组三⻆形

如下图:

在这里插入图片描述

4. OpenGL 三⻆形

  • OpenGL中光栅化最欢迎的是三⻆形,3个顶点就能构成⼀个三⻆形
  • 如下图所示:
    在这里插入图片描述
  • 在绘制第⼀个三⻆形时,线条是按照从V0-V1,再到V2,最后再回到V0的⼀个闭合三⻆形。 这个是沿着顶点顺时针⽅向。这种顺序与⽅向结合来指定顶点的⽅式称为环绕。
  • 在默认情况下,OpenGL 认为具有逆时针⽅向环绕的多边形为正
    ⾯。这就意味着上图左边是正⾯,右边是反⾯。

正反面的判定可以通过以下API修改,但是不建议修改。
glFrontFace(GL_CW)
GL_CW:告诉OpenGL 顺时针环绕的多边形为正⾯
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正⾯

发布了52 篇原创文章 · 获赞 5 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/shuan9999/article/details/105414342