OpenGL 渲染基础-常用API

626 阅读4分钟

透视投影

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

翻译:Frustum: (平)截头体;截(头)锥体 perspective: 透视

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

参数

参数1:fFov:垂直方向上的视场角度,即可视空间顶面和底面间的夹角,必须大于0
参数2:fAspect:窗口的宽度与高度的纵横⽐比
参数3:fNear:近裁剪面距离 
参数4:fFar:远裁剪面距离

注意:纵横⽐比 = 宽(w)/高(h), h 不能为0

参见下图:

Frustum图例


存储着色器

初始化

// GLShaderManager 的初始化 
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,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的7种基本图元

  • GL_POINTS

    每个顶点在屏幕上都是单独点

  • GL_LINES

    每一对顶点定义一个线段

  • GL_LINE_STRIP

    一个从第一个顶点依次经过每一个后续顶点而绘制的线条

  • GL_LINE_LOOP

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

  • GL_TRIANGLES

    3个顶点定义一个新的三角形

  • GL_TRIANGLE_STRIP

    共用一个条带(strip)上的顶点的一组三角形

  • GL_TRIANGLE_FAN

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

图示如下:

基本图元信息


OpenGL三角形

默认情况下,OpenGL认为具有逆时针方向环绕的多边形为正面。

glFrontFace(GL_CW)
// GL_CW: clock wise 告诉OpenGL 顺时针环绕的多边形为正面
// GL_CCW: Counter clock wise 告诉OpenGL,逆时针环绕的多边形为正面

工具类GLBatch

是在GLTools中包含的一个简单容器类

翻译:primitive:原始的 这里指图元

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渲染基础,包括投影,着色器,基本图样展示。