OpenGL 编程指南 (3.1)
1、OpenGL使用的是RGB颜色空间,例如三个颜色分量各占8位,那么就说这个颜色值色深24,能够表示2^24中颜色。
2、多重采样是基于采样的抗锯齿技术,有OGAA(ordered grid anti-sliasing)、SGAA(sparse grid anti-aliasing)、MSAA(multi-sampling anti-aliasing)、CSAA(coverage sampling anti-aliasing)等众多实现方式。fragment shader中有gl_SamplePosition、gl_SampleID等内置变量与之相对应的相关信息,限定符sample修饰fragment shader的输入变量时,会在同一个像素上执行多次,每次输出不同的样本位置信息。sample shader 专门用于描述逐样本执行的shader。如下:
#version 330 core
sample in vec4 color;
out vec4 fragColor;
void main()
{
fragColor = color;
}
3、片元的测试与操作
1)剪切测试(scissor test)
是片元可见性判断的第一个附加测试。glEnable(GL_SCISSOR_TEST)启用该测试,void glScissor(GLint x, GLint y, GLsizei width, GLsizei height)将绘制区域限制在该函数参数所形成的矩形内。默认情况下,剪切矩形与窗口大小一致并且是关闭的。(与视窗的绘制限制不同,视窗的不会限制屏幕的清除操作)
2)多重采样操作
默认情况下多重采样计算片元覆盖率不会考虑alpha,开启一下功能则会将alpha纳入参考。
.GL_SAMPLE_ALPHA_TO_COVERAGE 使用片元的alpha来聚散最后采样覆盖率,并且这个过程与硬件实现无关。
.GL_SAMPLE_ALPHA_TO_ONE 将片元的alpha值设置为最大值,然后时候这个值进行覆盖率计算。
.GL_SAMPLE_COVERAGE 将使用glSampleCoverage设置的数值,与覆盖率计算结果进行 与 操作。
.GL_SAMPLE_MASK 使用glSampleMaski设置一个精确的位掩码来计算和表达覆盖率,与片元的采样覆盖值进行 与 操作。这个值也可以通过fragment shader 的 gl_SampleMask进行设置。
3)模板测试(stencil test)
使用模板测试需要在创建窗口时请求生成模板缓冲,使用glStencilFunc 与 glStencilOp 设置测试的mask与比较方法。
void glStencilFunc(Glenum func, GLint ref, GLuint mask)//func是比较方法的枚举,ref是参考值,mask是测试掩码
void glStencilSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)//允许我们为多边形的正面和背面分别设置模板参数
void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
void glStencilSeparateOp(GLenum fail, GLenum zfail, GLenum zpass)
4)深度测试(depth test)
使用深度测试需要在创建窗口时请求生成深度缓冲,启用GL_DEPTH_TEST。
void glDepthFunc(GLenum func)//可以选定比较深度的方法,GL_LESS等
比如需要给物体的边框加亮显示,那么可以正常的绘制一遍物体,然后使用glPolygonMode设置为点线模式绘制一遍物体,但是因为这两种绘制模式下的光栅化方法并非完全一致,所以可能造成深度冲突(斑驳,stitching),有一种通常的处理方法就是为它们加一个适当的偏移值,对应于glEnable的参数是GL_POLYGON_OFFSET_POINT、GL_POLYGON_OFFSET_LINE、GL_POLYGON_OFFSET_FILL中的一种,与下面这个函数配合确定偏移值。
void glPolygonOffset(GLfloat factors, GLfloat units)//offset = m*factor + r*units
m是多边形最大深度斜率(光栅化的时候得到),r是深度值最小可识别间隔。m的意义是在遍历多边形时,z相对于x或y坐标上的变化关系式

5)融合(blending)
一个片元通过了上面的所有测试,就可以与当前的颜色缓冲相对应的位置按照指定的方式进行内容的合并,这称之为融合。
void glBlendFunc(GLenum srcfactor, GLenum destfactor)//src是当前处理片元,dest是缓冲中已经存在的数据
void glBlendFunci(GLuint buffer, GLenum srcfactor, GLenum destfactor)//buffer是缓冲id,多缓冲绘制时候使用
void glBlendFuncSeparate(GLenum srcRGB, GLenum destRGB, GLenum srcAlpha, GLenum destAlpha)//功能与上面的相同,只是指定了src与dest的色值,设置的是所有可绘制的缓冲的混合参数
void glBlendFuncSeparatei(GLuint buffer, GLenum srcRGB, GLenum destRGB, GLenum srcAlpha, GLenum destAlpha)
上面的方法指定的都是混合是参与计算的数值比例等,下面的将是指定计算方法
void glBlendEquation(GLenum mode)
void glBlendEquationi(GLuint buffer, GLenum mode)
void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
void glBlendEquationSeparatei(GLuint buffer, GLenum modeRGB, GLenum modeAlpha)
计算方式有GL_FUNC_ADD(默认方式)、GL_FUNC_SUBTRACT、GL_REVERSE_SUBTRACT、GL_MIN、GL_MAX等
6)抖动(dithering)
对于颜色位面数目较小的系统,可以通过对图像中的颜色进行抖动来提升颜色的分辨率,代价是损失一定的空间分辨率(???)。抖动是与硬件相关的,OpenGL只提供了开启与关闭没有其它操作空,GL_DITHER。
7)逻辑操作
这是片元的最后一个逻辑操作,包括或(OR)、异或(XOR)、反转(INVERT),作用于src与dest。这种操作对于位块传输类型系统非常有用,因为它们的主要的图形操作就是讲某一处矩形数据拷贝到另外一处。逻辑操作是对输入数据与已有数据做一次逻辑操作来得到新的目标数据。可以通过传递GL_COLOR_LOGIC_OP参数开启它,默认状态值是GL_COPY。
void glLogicOp(Glenum opcode)//GL_AND、GL_OR、GL_NAND、GL_NOR......
但是对于浮点型缓冲或者是sRGB格式缓冲,逻辑操作将会被自动忽略。
4、渲染查询
为了尽可能的提高性能,尽可能的先判断几何物体的可见性再将它们的几何信息送入渲染管线,可以使用遮挡查询的方法判断几何物体的可见性,这一步在深度测试值后完成。算法的大致为先渲染一个精简版的几何物体测试可见性,而且这个渲染过程尽可能简单,只要不影响可见性的测试其它所有功能都可以关闭,通过后再渲染真实的几何物体。
(1)为查询生成ID,调用glBeginQuery(ID),开始查询
(2)渲染精简版的几何物体,调用glEndQuery(ID)完成查询
(3)获取深度测试通过的样本数目
void glGenQueries(GLsizei n, GLuint* ids)//生成n个查询id,存储到ids中
void glBeginQuery(GLenum target, GLuint queryid)//target是需要查询的信息GL_SAMPLES_PASSED等表示一类渲染结果的枚举
void glEndQuery(GLenum target)
void glGetQueryObjectiv(GLenum queryid, GLenum pname, GLint* params)//pname表示需要获取查询状态如GL_QUERY_RESULT,params用于存储获取的结果
void glGetQueryObjectuiv(GLenum queryid, GLenum pname, GLint* params)
void glDeletQueries(GLsizei n, GLuint* ids)
5、条件渲染
对于上面的渲染查询,OpenGL需要停止几何体与片元的处理来处理查询和将这些结果反馈给应用程序。目前,可用使用条件渲染来优化这一性能损失,根据查询结果确定接下来要做什么。
void glBeginConditionalRender(GLuint id, GLenum mode)//mode指定了如何使用查询结果GL_QUERY_WAIT、GL_QUERY_NO_WAIT、GL_QUERY_BY_REGION_WAIT、GL_QUERY_BY_REGION_NO_WAIT
void glEndConditionRender()
6、简单的反走样
OpenGL会通过像素块所覆盖的范围来就散每个片元的覆盖值,然后与Alpha相乘,接着就能进行混合的操作。可以使用glHint来控制图像的反走样,不过这个方法与硬件实现相关。
void glHint(GLenum target, GLenum hint)

1)线段反走样
首先需要开启融合状态。
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT, gl_DONT_CARE);
2)多边形反走样与线段反走样类似
OpenGL 编程指南 (3.1)的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- opengl编程指南
第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口. 1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...
- OpenGl编程指南第7版(红宝书)环境配制
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法
解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
随机推荐
- 《HTML&CSS design and build websites》学习笔记(1)
Chapter 1: Structure Chapter 2: Text <head>表示标题,默认显示在第一行. <title>表示抬头,显示在浏览器的标签页,还有窗口栏. ...
- PRML学习准备
因为很怕PRML课程,所以想提前学习下做点准备. 看的一个学习内容就是python数据处理那本书,比较仔细地学习了 numpy,大致看了pandas和 matplotlib ,有以下几点感受 nump ...
- 浅谈python的第三方库——numpy(三)
numpy库中矩阵的常用方法 1 矩阵转置 从上图可以看出:使用方法a.T可以将矩阵a转置. 2 均值与方差 注意:方法a.mean()会对矩阵a的所有元素求均值,a.var()也是考虑矩阵a的所有元 ...
- word中模板的使用
新建一个word文档,修改样式库中的样式,比如各章节的标题正式格式.设计好后,将文件保存为word模板. 一般自定义的模板默认保存在”C:\Users\lizhe\Documents\自定义 Offi ...
- vue-infinite-loading 过滤器tab正确使用
业务逻辑涉及loadmore,filter和tab切换,框架是vue,使用vue-infinite-loading中的一点经历. identifier 一开始并没有重视这个参数,只是他的官网说iden ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL
实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...
- linux基础之Mini Linux制作
一.编译一个简单的linux步骤如下: # yum groupinstall ""Development Tools" "Server Platform Dev ...
- 0级搭建类006-Oracle Solaris 安装 (10.13) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- Linux一些基本命令、inode定义、软硬链接
1.创建普通文件命令:touch 命令 2.创建目录文件命令:mkdir 命令 3.删除普通文件命令:rm 命令 4.删除目录文件命令:rmdir 命令 5.给普通文件写东西命令:vim 命令 6.查 ...
- H5_0020:判断安卓苹果平台
var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...