透视投影
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
参见下图:
存储着色器
初始化
// 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渲染基础,包括投影,着色器,基本图样展示。