OpenGL学习——(3)库函数

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);

未完待续……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值