1.定义视口
void ChangeSize(int w,int h){
glViewport(0,0,w,h);//代表窗口中视口的左下角坐标是(0,0)(通常都是0,0),w和h用像素表示
}
在窗口改变大小时接收新的宽和高。glViewport主要完成修改从目的坐标系到屏幕坐标系上的映射。OpenGL可以在这个区域中进行绘图(也称为渲染区域)。
2.背景设置
glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
glClearColor(0.0f,0.0f,1.0f,1.0f);//设置在颜色缓冲区被清除时使用的颜色(参数范围在0.0~1.0之间),alpha参数表示允许光线穿过的程度,值越大透明度越大
3.简单着色器的设置
没有着色器,在OpenGl核心框架中就无法进行任何渲染。
GLShaderManager shaderManager;//需要在***源文件的开头部分声明***一个着色器管理器的实例
//声明后需要在OpenGL初始化时调用InitializeStockShaders方法
shaderManager.InitializeStockShaders();
4.按键控制
注册SpecialKeys回调函数用来控制特殊按键
glutSpecialFunc(SpecialKeys);
//操作完之后需要进行窗口更新
glutPostRedisplay();
//默认调用RenderScene函数更新窗口
5.关于图元的函数
/***********点**********/
void glPointSize(GLfloat size);//设置默认点的大小
GLfloat sizes[2];//存储支持的点大小范围(包含最小值和最大值)
GLfloat step;//存储支持的点大小增量(俩相邻点大小值间的最小步长)
//获取支持的点大小范围和步长(增量)
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);
//通过使用程序点大小模式来设置点大小
glEnable(GL_PROGRAM_POINT_SIZE);//在这种模式下可以通过顶点着色器来设置点大小
gl_PointSize=5.0;//大小可以根据自己的需要进行设置
/***********线段********/
//设置线段宽度
void glLineWidth(GLfloat whidth);
//默认逆时针旋转得到的图形是原图的正面,可以通过如下函数改变成顺时针方向旋转得到的是正面
glFrontFace(GL_CW);//恢复的参数是GL_CCW
6.如何使用一个简单的批处理容器
//GLTools库中包含一个简单的容器类——GBatch,可以对图元进行简单批处理的容器使用
//初始化
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits=0);//声明处理的哪类图元,定点数,一组或俩组纹理坐标(可选)
void GLBatch::CopyVertexData3f(GLfloat *vVerts);//至少要复制一个由3个分量(x,y,z)
void GLBatch::CopyNormalData4f(GLfloat *vNormal);//复制表面法向量
void GLBatch::CopyColorData4f(GLfloat *vColors);//复制颜色
void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords,GLuint uiTextureLayer);//复制纹理坐标
void GLBatch::End(void);//表明已经完成数据复制工作,并设置内部标记,以通知这个类包含哪些属性
关于批处理容器的一个例子——创建一个三角形
GLBatch triangleBatch;//创建一个容器实例
//设置一个三角形
GLfloat vVerts[]={
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f
};
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangelBatch.End();
//调用着色器并绘画
GLfloat vRed[]={1.0f,0.0f,0.0f,1.0f};
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
triangelBatch.Draw();
7.剔除
//开启剔除
glEnable(GL_CULL_FACE);
//关闭
glDisable(GL_CULL_FACE);
//剔除(GL_FRONT\GL_BACK\GL_FRONT_AND_BACK)
glCullFace(GL_BACK);//剔除不透明物体的内部几何图形
8.缓冲区的设置
在使用glut设置OpenGL窗口时应该请求一一些缓冲区,设置颜色和深度缓冲区如下:
glutInitDisplayMode(GLUT_DOUBLE|CLUT_RGBA|GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);//启用深度测试
9.多边形模式
可以通过glPolygonMode将多边形渲染成实体、轮廓或只有点
void glPolygonMode(GLenum face,GLenum mode);//face的参数有(GL_FRONT、GL_BACK或GL_FRONT_AND_BACK),mode的参数有(GL_FILL默认、GL_LINE或GL_POINT)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINK);//将多边形正面和背面设置为线框模式
glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);//将多边形正面和背面设置为点云模式
10.调节片段深度值
//可以是深度值产生偏移而并不实际改变3D空间中的物理位置
void glPolygonOffset(GLfloat factor,GLfloat units);//负值将使z值距离我们更近,正值会使移动更远,具体值需要进行试验
11.裁剪
OpenGL允许我们将要进行渲染的窗口制定在一个裁剪框
glEnable(GL_SCISSOR_TEST);//开启裁剪测试
glDisable(GL_SCISSOR_TEST);//关闭裁剪测试
//指定裁剪窗口
void glScissor(GLint x,GLint y,GLsizei width,GLsizei height);//x和y指定裁剪框左下角坐标,width和height为裁剪框的相应尺寸
//一个小例子,对屏幕进行三次清除,叠加出一块重叠的彩色区域
void RenderScene(void){
//清除一块蓝色区域
glClearColor(0.0f,01.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//清除一块红色区域并进行裁剪
glClearColor(1.0f,0.0f,0.0f);
glScissor(100,100,600,400);
glEnable(GL_SCISSOR_TEST);
glClear(GL_BUFFER_BIT);
//清除一块绿色区域
glClearColor(0.0f,0.0f,1.0f);
glScissor(200,200,400,200);
glClear(GL_BUFFER_BIT);
//提交裁剪并进行下一步读取
glDisable(GL_SCISSOR_TEST);
glutSwapBuffers();
}
效果图:
12.混合功能
打开混合功能后,新的颜色会与已经存在的颜色值在颜色缓冲区中进行组合。这些颜色的组合方式不同会导致很多不同的特殊效果。
glEnable(GL_BLEND);//打开混合功能
//影响最终颜色的公式
//Cf=(Cs*S)*(Cd*D)
//Cf为最终产生的颜色,Cs是源颜色,Cd是目标颜色,S和D分别是源和目标的混合因子,其设置使用如下函数
glBlendFunc(GLenum S,GLenum D);//S和D都是枚举值
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//混合函数的使用,具体参数可以参考混合参数表
void glBlendFuncSeparate(GLenum srcRGB,GLenum dstRGB,Glenum srcAlpha,GLenum dstAlpha);//为RGB和alpha单独指定混合函数
void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);//修改常量混合颜色初始颜色
可以使用的混合方程式如下图:
13.抗锯齿
抗锯齿是混合功能中处理的一方面。由于像素是一种近似正方形的,通常可以相当清楚地看到俩种颜色的分界,这些分界就是锯齿。(影响图形的真实性)
//开启混合功能,选择合适的混合方程式
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//对图元进行抗锯齿处理
glEnable(GL_POINT_SMOOTH);//对点进行抗锯齿处理
glEnable(GL_LINE_SMOOTH);//对线进行抗锯齿处理
glEnable(GL_POLYGON_SMOOTH);//对多边形进行抗锯齿处理
14.多重采样
被开启时,点、线段和多边形的平滑特征都将被忽略。其主要用于实心几何图形的处理。
//请求一个多重采样、完全颜色、带深度的双缓冲帧缓冲区
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH|GLUT_MULTISAMPLE);
//打开和关闭多重采样
glEnable(GL_MULTISAMPLE);
glDisplay(GL_MULTISAMPLE);
多重采样缓冲区在默认情况下使用片段的RGB值,并不包括颜色的alpha成分,我们可以调用glEnable(参数)来修改这个行为:
- GL_SAMPLE_ALPHA_TO_COVERAGE——使用alpha值
- GL_SAMPLE_ALPHA_TO_ON——将alpha设置为1并使用
- GL_SAMPLE_COVERGE——使用glSampleCoverage所设置的值。需要使用如下函数进行设置
void glSampleCoverage(GLclampf value,GLboolean invert);
未完待续……