美文网首页
OpenGL中的基本概念

OpenGL中的基本概念

作者: 卡布奇诺_95d2 | 来源:发表于2020-08-10 18:21 被阅读0次

转自:https://www.jianshu.com/p/6bbe15ca4d48

投影方式

  • 正投影:用于显示2D图形
SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)
  • 透视投影:用于显示3D图形
/*
fFov:垂直方向的视场角度
fAspect:窗口纵横比(宽/高)
fNear:近裁剪面距离
fFar:远裁剪⾯距离
*/
SetPerspective(float fFov, float fAspect, float fNear, float fFar)

存储着色器

1. 单元着色器:GLT_SHADER_IDENTITY

  1. 使用默认的笛卡尔坐标系,在所有坐标轴上的坐标范围为(-1,1);
  2. 所有片段都应用同一种颜色;
  3. 几何图形为实心和未渲染的;
  4. 只使用一个属性GLT_ATTRIBUTE_VERTEX;
/*
GLT_SHADER_IDENTITY:存储着色器类型 -- 单元着色器
GLfloat vColor[4]:颜色,RGBA
*/
GLShaderManager:: UserStockShader(GLT_SHADER_IDENTITY, GLfloat vColor[4]);

2. 平面着色器:GLT_SHADER_FLAT

  1. 为几何图形变换定制一个4*4变换矩阵,通常是左乘模型视图矩阵和投影矩阵,被称为“模型视图投影矩阵”(ModelViewProjectionMatrix),简称MVP;
  2. 只使用一个属性GLT_ATTRIBUTE_VERTEX;
/*
GLT_SHADER_FLAT:存储着色器类型 -- 平面着色器
GLfloat mvp[16]:允许变化的4*4矩阵
GLfloat vColor[4]:颜色,RGBA
*/
GLShaderManager:: UserStockShader(GLT_SHADER_FLAT,GLfloat mvp[16], GLfloat vColor[4]);

3. 上色着色器:GLT_SHADER_SHADED

  1. 在绘制图形的时候,可以应用变换(模型/投影变换),颜色值将被平滑的插入到顶点之间称不平滑着色;
  2. 使用两个属性,分别为GLT_ATTRIBUTE_VERTEX和GLT_ATTRIBUTE_COLOR;
/*
GLT_SHADER_SHADED:存储着色器类型 -- 上色着色器
GLfloat mvp[16]:允许变化的4*4矩阵
*/
GLShaderManager:: UserStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]);

4. 默认光源着色器:GLT_SHADER_DEFAULT_LIGHT

  1. 类似由观察者位置的单漫射散光所产生的效果,使对象产生阴影和光照效果。
  2. 使用两个属性,分别是GLT_ATTRIBUTE_VERTEX和GLT_ATTRIBUTE_NORMAL。
/*
GLT_SHADER_DEFAULT_LIGHT:存储着色器类型 -- 默认光源着色器
GLfloat mvMatrix[16]:模型视图矩阵
GLfloat pMatrix[16]:投影矩阵
GLfloat vColor[4]:颜色,RGBA
*/
GLShaderManager:: UserStockShader(GLT_SHADER_DEFAULT_LIGHT, GLfloat mvMatrix[16], GLfloat pMatrix[16], GLfloat vColor[4]);

5. 点光源着色器:GLT_SHADER_POINT_LIGHT_DIEF

  1. 类似由观察者位置的单漫射散光所产生的效果,使对象产生阴影和光照效果,此时光源可以另外设定。
  2. 使用GLT_ATTRIBUTE_VERTEX和GLT_ATTRIBUTE_NORMAL。
/*
GLT_SHADER_POINT_LIGHT_DIEF:存储着色器类型 -- 点光源着色器
GLfloat mvMatrix[16]:模型视图矩阵
GLfloat pMatrix[16]:投影矩阵
GLfloat vLightPos[3]:点光源的位置
GLfloat vColor[4]:颜色,RGBA
*/
GLShaderManager::UserStockShader(GLT_SHADER_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]);

6. 纹理替换着色器:GLT_SHADER_TEXTURE_REPLACE

  1. 使用指定的纹理对几何图形进行变换,片段颜色直接从纹理样本中获取。
  2. 使用GLT_ATTRIBUTE_VERTEX和GLT_ATTRIBUTE_NORMAL。
/*
GLT_SHADER_TEXTURE_REPLACE:存储着色器类型 -- 纹理替换着色器
GLfloat mvpMatrix[16]:模型视图投影矩阵
GLint nTextureUnit:纹理单元
*/
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_REPLACE,GLfloat mvpMatrix[16],GLint nTextureUnit);

7. 纹理调整着色器:GLT_SHADER_TEXTURE_MODULATE

/*
GLT_SHADER_TEXTURE_MODULATE:存储着色器类型 -- 纹理调整着色器
GLfloat mvpMatrix[16]:模型视图投影矩阵
GLfloat vColor:基本色
GLint nTextureUnit:纹理单元
*/
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvpMatrix[16],GLfloat vColor, GLint nTextureUnit);

8. 纹理光源着色器:GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF

  1. 将一个纹理通过漫反射光照进行计算调整。
  2. 光线的位置是给定的。
  3. GLT_ATTRIBUTE_VERTEX、GLT_ATTRIBUTE_TEXTURE0和GLT_ATTRIBUTE_NORMAL。
/*
GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF:存储着色器类型 -- 纹理光源着色器
GLfloat mvMatrix[16]:模型视图矩阵
GLfloat pMatrix[16]:投影矩阵
GLfloat vLightPos[3]:点光源位置
GLfloat vBaseColor[4]:基本色,RGBA
GLint nTextureUnit:纹理单元
*/
GLShaderManager::UserStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit);

GLBatch

GLTools库包含一个简单的容器类GLBatch。这个类可以作为下表中列出的七种图元简单批次的容器使用,而且它知道在使用GLShaderManager支持的任意存储着色器时如何对图元进行渲染。这个类的目的是为了解决容纳一个顶点列表并将它们作为特定类型的图元批次来进行渲染。

图元 描述
GL_POINTS 每个顶点在屏幕上都是单独的点
GL_LINES 每一对顶点定义一个线段
GL_LINE_STRIP 一个从第一个顶点依次经过每一个后续顶点而绘制的线条
GL_LINE_LOOP 和GL_LINE_STRIP一样,但是最后一个顶点与第一个顶点连接起来,形成一个闭环
GL_TRIANGLES 每三个顶点定义一个新的三角形
GL_TRIANGLE_STRIP 共用一个条带(strip)上的顶点的一组三角形
GL_TRIANGLE_FAN 以一个点为圆心呈扇形排列,共用相邻顶点的一组三角形

基本图元效果如下:


image.png

GLBatch使用示例:

pointBatch.Begin(GL_POINTS, 3);
pointBatch.CopyVertexData3f(vCoast);
pointBatch.End();
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vBlack);
pointBatch.Draw();

GLTriangleBatch

除了GLBatch类,我们还可以使用三角形批次类GLTriangleBatch。它的特性如下:

  1. 专门作为三角形的容器。
  2. 每个顶点都可以有一个表面法线以进行光照计算和纹理坐标。
  3. 将三角形以更高效的方式(顶点索引数组)进行组织,并且实际上将多边形存储在图形卡(使用定点缓冲区对象)

1. 创建一个球体

/*
GLTriangleBatch& sphereBatch:三角形批次类对象
GLfloat fRadius:球体半径
GLint iSlices:从球体底部堆叠到顶部的三角形带的数量,其实球体是一圈一圈的三角形带组成
GLint iStacks:围绕球体一圈排列的三角形对数
建议1:一个对称性较好的球体的片段数量是堆叠数量的2倍,即iStacks = 2*iSlices。
建议2:绘制球体都是围绕z轴,这样,+z就是球体的顶点,-z就是球体的底部
*/
gltMakeSphere(GLTriangleBatch& sphereBatch, GLfloat fRadius, GLint iSlices, GLint iStacks);

2. 创建甜甜圈

/*
GLTriangleBatch& torusBatch:三角形批次类对象
GLfloat majorRadius:甜甜圈中心到外边缘的半径
GLfloat minorRadius:甜甜圈中心到内边缘的半径
GLint numMajor:沿外半径的三角形数量
GLint numMinor:沿内半径的三角形数量
*/
gltMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor);

3. 创建一个圆柱或圆椎

/*
GLTriangleBatch& cylinderBatch:三角形批次类对象
GLfloat baseRadius:底部半径
GLfloat topRadius:头部半径
GLfloat fLength:圆形长度
GLint numSlices:围绕Z轴的三角形对的数量
GLint numStacks:圆柱底部堆叠到顶部圆环的三角带的数量
*/
void gltMakeCylinder(GLTriangleBatch& cylinderBatch, GLfloat baseRadius, GLfloat topRadius, GLfloat fLength, GLint numSlices, GLint numStacks);

4. 创建一个圆盘

/*
GLTriangleBatch& diskBatch:三角形批次类对象
GLfloat innerRadius:内圆半径
GLfloat outerRadius:外圆半径
GLint nSlices:圆盘围绕Z轴的三角形对的数量
GLint nStacks:圆盘外网到内围的三角形带的数量
*/
void gltMakeDisk(GLTriangleBatch& diskBatch, GLfloat innerRadius, GLfloat outerRadius, GLint nSlices, GLint nStacks);

相关文章

网友评论

      本文标题:OpenGL中的基本概念

      本文链接:https://www.haomeiwen.com/subject/muljdktx.html