openGL的投影方式、存储着色器理解、图元连接方法

380 阅读4分钟

投影方式

投影方式 显示方式 函数 参数说明
正投影 显示2D图片,图片中相同物体前后无大小区别 SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax) x最小值,x最大值,y最小值,y最大值,z最小值,z最大值
透视投影 显示3D图片,图片中相同物体前后有大小区别 SetPerspective(float fFov, float fAspect, float fNear, float fFar) arg0:垂直向上的视角 arg1:窗口大小的纵横比 => w/h arg2:近剪裁面距离 arg3:远剪裁面距离

着色器类型

着色器名称 使用枚举值 调用方法用列 场景
单位着色器 GLT_SHADER_IDENTITY GLShaderManger::UseStockShader(GLT_SHADER_IDENTITY,GLfloat mvp[16],GLfloat vColor[4]) 绘制默认 Opengl坐标系(-1,1)下的坐标图形所有片段都会以一种颜色填充
平面着色器 GLT_SHADER_FLAT GLShaderManger::UseStockShader(GLT_SHADER_FLAT,GLfloat mvp[16],GLfloat vColor[4]) 在绘制图形时,可以应用变换(模型/投影变化)即允许图形变换指定一个4*4的变换矩阵场景
上色着色器 GLT_SHADER_SHADED GLShaderManger::UseStockShader(GLT_SHADER_SHADED,GLfloat mvp[16]) 在绘制图形时,可以应用变换(模型/投影变化)颜色将会平滑的插入到顶点之间,成为平滑着色
默认光源着色器 GLT_SHADER_DEFAULT_LIGHT GLShaderManger::UseStockShader(GLT_SHADER_DEFAULT_LIGHT,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vColor[4]) 在绘制图形时,可以应用变换(模型/投影变化)这种着色器会使绘制的图形产生阴影和光照效果
点光源着色器 GLT_SHADER_POINT_LIGHT_DIFE GLShaderManger::UseStockShader(GLT_SHADER_POINT_LIGHT_DIFE,GLfloat mvMatrix[16],GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vColor[4]) 在绘制图形时,可以应用变换(模型/投影变化)着色器会使绘制的图形产生阴影和光照效果与默认光源非常类似,区别在于光源位置可能是特定的
纹理替换着色器 GLT_SHADER_TEXTURE_REFLACE GLShaderManger::UseStockShader(GLT_SHADER_TEXTURE_REFLACE,GLfloat mvpMatrix[16],GLint nTextureUnit) 在绘制图形时,可以应用变换(模型/投影变化)种着色器通过给定的模型视图投影矩阵,使用纹理单元来进行颜色填充其中每个像素点的颜色是从纹理中获取的
纹理调整着色器 GLT_SHADER_TEXTURE_MODULATE GLShaderManger::UseStockShader(GLT_SHADER_TEXTURE_MODULATE,GLfloat mvpMatrix[16],GLfloat vColor,GLint nTextureUnit) 在绘制图形时,可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵,着色器将一个基本色乘以一个取自纹理单元一个取自纹理单元 "nTextureUnit"的纹理将颜色与纹理进行颜色混合后才填充到片段中
纹理光源着色器 GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF GLShaderManger::UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF, GLfloat mvMatrix,GLfloat pMatrix[16],GLfloat vLightPos[3],GLfloat vBaseColor[4],GLint nTextureUnit) 在绘制图形时,可以应用变换(模型/投影变化)这种着色器通过给定的模型视图投影矩阵着色器将一个纹理通过漫反射照明计算进行调整(相乘)

常见图元连接方式

图元 名称 说明
GL_POINTS 每个顶点在屏幕上都是单独的点
GL_LINE 线 每2个点获取一条线
GL_LINE_STRIP 线段 点一个点开始依次每个点获取一条线
GL_LINE_LOOP 线环 前面与GL_LINE_STRIP类似,最后一个点与第一个点连接成环
GL_TRIANGLES 三角形 每3个顶点定义一个新的三角形
GL_TRIANGLE_STRIP 三角形扇 共用一条带上顶点的三角形
GL_TRIANGLE_FAN 三角形带 以第一个点为圆心,呈扇形排列共用相邻顶点的一组三角形

效果如下

三角形环绕方式

  • OpenGL中默认具有逆时针环绕方向的多边形为正面
  • 可以通过代码修改默认的正面
glEnable(GL_CULL_FACE);//开启正背面剔除
glbatch.draw();//绘制图形
glDisable(GL_CULL_FACE);//关闭正背面剔除
glFrontFace(GL_CW);
GL_CW:设置OpenGL中 顺时针环绕的多边形为正⾯面;
GL_CCW:设置OpenGL中 逆时针环绕的多边形为正⾯面

三角形带的优势

  • 第一个三角形用了3个顶点之后,对于之后的三角形,每次只需再指定一个顶点,即可构成三角形。当需要绘制大量三角形时,一是可以复用,而是可以节省存储空间。
  • 提高运算性能和节省宽带,更少的顶点使数据从内存传输到顶点着色器的速度更快,顶点着色器中顶点处理的次数也更少。

工具类 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)