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)的更多相关文章

  1. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. opengl编程指南

    第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...

  6. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)

    1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...

  7. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  8. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  9. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  10. Opengl编程指南第二章:状态管理、几何绘图

    //http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...

随机推荐

  1. ubuntu--- tracker/libdeepsort.so 找不到cv报错

    一.刚开始解决尝试:因为“删掉lib下的libdeepsort.so报错”,原先以为是 libdeepsort.so 需要拷贝到 /lib路径下的问题,可是因为后来的工程有的好使,又的不好使了.''' ...

  2. hibernate.exception.GenericJDBCException: could not extract ResultSet 解决办法

    这句话翻译过来就是无法提取ResultSet 我在联查表的视图的时候发现的问题,明明之前好好的 那么你就得想想了 你再把错误信息往上翻翻,能不能看到   no viable alternative a ...

  3. SpringCloud(一)

    什么是SpringCloud? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  4. 数据类型(8种)和运算符——Java

    一.什么是标识符,它有什么作用(重点掌握) 1. 标识符指的是 标识符是用户编程时使用的名字,用于给变量.常量.函数.语句块等命名,以建立起名称与使用之间的关系.标识符可由任何字母数字字符串形成. 2 ...

  5. pyjsonrpc的使用

    pyjsonrpc的使用 客户端 JsonRpcClient.py #!usr/bin/env python2.7 # -*- coding: utf-8 -*- import ssl import ...

  6. CF1300E Water Balance

    题目链接 problem 给出一个长度为n的序列,每次可以选择一个区间\([l,r]\)并将区间\([l,r]\)内的数字全部变为这些数字的平均数.该操作可以进行任意多次. 求出进行任意次操作后可以得 ...

  7. 技术之心 | 云信和TA们携手打响防疫战

      1月27日,教育部发布<关于2020年春季学期延期开学的通知>,各地高等院校.中小学.幼儿园纷纷推迟开学.疫情当前,学生们的鼠年寒假变得无比漫长. 网易云信众多教育客户以行动践行教育的 ...

  8. 360独角兽实习,连载周记(gnuradio 低功耗蓝牙BLE 综合工具模块编写)

    (有点乱,之后会有整理) 最近在用写一套gnuradio的OOT模块,主要用来进行BLE嗅探的,github上有了一些工具,可是他们并没有很好的模块化,于是打算自己写一个,这样以后做一些其他的项目,模 ...

  9. MySQL数据库渗透及漏洞利用总结

    Mysql数据库是目前世界上使用最为广泛的数据库之一,很多著名公司和站点都使用Mysql作为其数据库支撑,目前很多架构都以Mysql作为数据库管理系统,例如LAMP.和WAMP等,在针对网站渗透中,很 ...

  10. 数位dp(模板+例题)

    文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...