OpenGL 投影方式、存储着色器、基本图元连接

2020-07-10  本文已影响0人  Joker_King

投影方式

正投影

图像以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 以一个圆点为中心,公用相邻顶点的一组三角形
image-20200710140908125

OpenGL 点/线

OpenGL 三角形

对于OpenGL光珊瑚最欢迎的就是三角形,3个顶点就能构成一个三角形,三角形类型来自于顶点,并不是所有的三角形都是正三角形。 image-20200710141900379

OpenGL三角形环绕方式

在绘制第一个三角形的时候,线条是按照从v0~v1,再到v2。最后再回到v0的一个闭合三角形。这个是沿着顶点顺时针方向。这中顺序与方向结合来指定顶点的方式成为环绕。

image-20200710142359567

在默认情况下,OpenGL认为具有逆时针方向环绕的多边形为正面。这就意味着上图左边是正面,右边是反面。

glFrontFace(GL_CW);

GL_CW:告诉OpenGL 顺时针环绕的多边形为正面;

GL_CCW:告诉OpenGL 逆时针环绕的多边形为正面;

OpenGL三角形带

对于很多表面或者形状而言,我们会需要绘制几个相连的三角形,这时我们可以使用GL_TRIANGLE_STRIP图元绘制一串相连的三角形,从而节省大量的时间。

image-20200710142833567

优点:

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)
上一篇下一篇

猜你喜欢

热点阅读