OpenGL 投影方式、存储着色器、基本图元连接
投影方式
正投影
图像以1:1的方式绘制到屏幕上。视觉上看到的是2D平面图像。
image-20200710105247748只有位于坐标系中的视图才可以被看到。
GLFrustum::SetOrthographic(<#GLfloat xMin#>, <#GLfloat xMax#>, <#GLfloat yMin#>, <#GLfloat yMax#>, <#GLfloat zMin#>, <#GLfloat zMax#>)
透视投影
以人眼的视角进行绘制,有远小近大的效果。
image-20200710105735524当我们的视窗越大,我们所能看到的范围就越大。
// fFov:垂直方向上的视窗角度
// fAspect:窗口的纵横比w/h
// fNear:近裁剪面距离
// fFar:元裁剪面的距离
GLFrustum::SetPerspective(<#float fFov#>, <#float fAspect#>, <#float fNear#>, <#float fFar#>)
存储着色器分类
单元着色器
GLT_SHADER_IDENTITY
参数1:存储各种着色器种类-单元着色器
参数2:颜色
GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);
场景
绘制默认OpenGL坐标系(-1,1)下的图形。图形的所有片段都会以一种颜色填充。
平面着色器
GLT_SHADER_FLAT
参数1:存储各种着色器种类-平面着色器
参数2:允许变化的4X4矩阵
参数3:颜色
GLShaderManager::UseStockShader(GLT_SHADER_FLAT, GLfloat mvp[16], GLfloat vColor[4]);
场景
在绘制图形时,可以应用变换(模型/投影变化)。
上色着色器
GLT_SHADER_SHADED
参数1:存储各种着色器种类-上色着色器
参数2:允许变化的4x4矩阵
GLShaderManager::UseStockShader(GLT_SHADER_SHADED, GLfloat vmp[16]);
场景
在绘制图形是,可以应用变换(模型/投影变换)颜色将会平滑的插入到顶点之间,称为平滑着色。
默认光源着色器
GLT_SHADER_DEFAULT_LIGHT
参数1:存储各种着色器种类-默认光源着色器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 颜⾊值
GLShaderManager::UseStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vmp[16]);
场景
在绘制图形时,可以应用变换(模型/投影变化)这种着色器会使绘制的图形产生阴影和光照的效果。
点光源着色器
GLT_SHADER_POINT_LIGHT_DIEF
参数1: 存储各种着色器种类-点光源着色器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源位置
参数5: 颜⾊值
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);
场景
在绘制图形时,可以应用变换(模型/投影变化)这种着色器会使绘制的图形产生阴影和光照效果,它与默认光源着色器非常类似,区别只是光源的位置可能是特定的。
纹理替换矩阵着色器
GLT_SHADER_TEXTURE_REPLACE
参数1: 存储各种着色器种类-纹理替换矩阵着色器
参数2: 模型4*4矩阵
参数3: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvMatrix[16],GLint nTextureUnit);
场景
在绘制图形时,可以应用变换(模型/投影变化)这种着色器通过给定的模型矩阵。使用纹理单元来进行颜色填充,其中每个像素点的颜色是从纹理中获取的。
纹理调整着色器
GLT_SHADER_TEXTURE_MODULATE
参数1: 存储各种着色器种类-纹理调整着色器
参数2: 模型4*4矩阵
参数3: 颜色值
参数4: 纹理单元
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvMatrix[16],GLfloat vColor[4],GLint nTextureUnit);
场景
在绘制图形时,可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵。着色器将一个基本色乘以一个取自纹理单元的nTextureUnit的纹理,将颜色与纹理进行颜色混合后才填充到片段中。
纹理光源着色器
GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF
参数1: 存储各种着色器种类-纹理光源着色器
参数2: 模型4*4矩阵
参数3: 投影4*4矩阵
参数4: 点光源位置
参数5: 颜色值
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,G Lfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);
场景
在绘制图形时,可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵。着色器将一个纹理通过漫反射照明计算进行调整(相乘)。
基本图元连接方式
图元 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是单独的点 |
GL_LINES | 每一对顶点定义一个线段 |
GL_LINE_STRIP | 一个从第一个顶点依次经过后续顶点绘制而成的线条 |
GL_LINE_LOOP | 和GL_LINE_STRIP相同,但是最后一个顶点和第一个顶点连接起来了 |
GL_TRIANGLES | 每三个顶点定义一个新的三角形 |
GL_TRIANGLE_STRIP | 公用一个条带(strip)上的顶点的一组三角形 |
GL_TRIANGLE_FAN | 以一个圆点为中心,公用相邻顶点的一组三角形 |
OpenGL 点/线
-
最简单最常用的4.0f,表示点的大小。
glPointSize(4.0f);
-
设置点的大小范围和点与点之间的间隔。
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;
-
获取点大小范围和最小步长。
glGetFloatv(GL_POINT_SIZE_RANGE ,sizes);
glGetFloatv(GL_POINT_GRAULARITY ,&step);
-
通过使用程序点大小模式来设置点大小。
glEnable(GL_PROGRAM_POINT_SIZE);
-
这种模式下允许我们通过编程在顶点着色器或几何着色器中设置点的大小。着色器内建变量:gl_PointSize(内建变量),并且可以在着色器源码直接写。
gl_PointSize = 5.0
-
设置线段宽度。
glLineWidth(2.5f);
OpenGL 三角形
对于OpenGL光珊瑚最欢迎的就是三角形,3个顶点就能构成一个三角形,三角形类型来自于顶点,并不是所有的三角形都是正三角形。 image-20200710141900379OpenGL三角形环绕方式
在绘制第一个三角形的时候,线条是按照从v0~v1,再到v2。最后再回到v0的一个闭合三角形。这个是沿着顶点顺时针方向。这中顺序与方向结合来指定顶点的方式成为环绕。
image-20200710142359567在默认情况下,OpenGL认为具有逆时针方向环绕的多边形为正面。这就意味着上图左边是正面,右边是反面。
glFrontFace(GL_CW);
GL_CW:告诉OpenGL 顺时针环绕的多边形为正面;
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正面;
OpenGL三角形带
对于很多表面或者形状而言,我们会需要绘制几个相连的三角形,这时我们可以使用GL_TRIANGLE_STRIP图元绘制一串相连的三角形,从而节省大量的时间。
image-20200710142833567优点:
- 用前3个顶点指定第1个三角形之后,对于接下来的每一个三角形,只需要再指定1个顶点。需要绘制大量的三角形时,采用这种方式可以节省大量的程序代码和数据存储空间。
- 提供运算性能和节省带宽,更少的顶点意味着从内存传输图形可的速度更快,并且顶点着色器需要处理的次数也更少了。
OpenGL三角形扇
对于很多表面或者形状而言,我们会需要绘制几个相连的三角形,这是我们可以使用GL_TRIANGLE_FAN图元绘制一组围绕一个中心点相连的三角形。
image-20200710143353398工具类 GLBatch
参数1:图元
参数2:顶点数
参数3:⼀组或者2组纹理理坐标(可选)
void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);
//复制顶点数据(⼀个由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)