【OpenGL蓝宝书】Chapter 12. Controlling and Monitoring the Pipeline

一、Queries

你可以向OpenGL的渲染管线“提问题”,问它现在的某个状况如何。就像上课提问要举手,你向OpenGL提问也要先举手。举手的时候,老师不知道你想问啥,但已经知道你有问题了。举手的操作就是glGenQueries(1, &query),query可以理解为“你”这个提问的人。和glGenTextures()很像有木有!

举手之后就提问,使用glBeginQuery(target, query);glEndQuery(target)。其中target就是你想问的问题。OpenGL已经预置了如GL_SAMPLES_PASSED之类的问题类型。

GL_SAMPLES_PASSED问的是:在BeginQuery和EndQuery之间的渲染有多少次采样通过了深度测试。之后会把结果告诉query(不是直接赋值哦,是把结果告诉这个人)。

想要取得这个值,就要使用glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result);让query把结果存进result。

利用以上特性,可以有一个优化渲染的想法:将复杂的图形先简化(通常情况下bounding box即可),然后渲染简化的模型。然后向pipeline提问:有多少采样通过了深度测试呀?如果返回不为0,那说明这个图形在界面中是可见的,然后就可以渲染他了。示例代码如下:

// code 1: basic query
glGenQueries(1, &query);    // 举手
glBeginQuery(GL_SAMPLES_PASSED, query);    // 提问
RenderSimplifiedObject(object);    // 渲染bounding box
glEndQuery(GL_SAMPLES_PASSED);    // 结束提问
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result);    // 统计
if (the_result != 0)
    RenderRealObject(object);    // 渲染真图形

另外一种情况是,BeginQuery和EndQuery之间的渲染太多啦,在你取值时还没统计完,这会导致OpenGL程序卡在这,等它统计。这就导致OpenGL程序优化不行。有个方法可以检查这个值统计好没,就是glGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &result)。统计好了,result==GL_TRUE;没统计好,result==GL_FALSE。

再回到之前这个优化渲染的想法:如果统计简化图形(bounding box)渲染的深度测试通过数量时发生了上述问题,则完全不必担心:result没有准备好就算了呗,我们只想知道跳过这个图形安不安全,result没好咱就不等了,只要把确定可以跳过的跳过就行了。优化过的代码如下:

// code 2: 老子不等啦
glGenQueries(1, &query);
glBeginQuery(GL_SAMPLES_PASSED, query);
RenderSimplifiedObject(object);
glEndQuery(GL_SAMPLES_PASSED);
glGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &result);    // 问它result能用了嘛
if (result == GL_TRUE)    // 能用啦
    glGetQueryObjectuiv(the_query, GL_QUERY_RESULT, &result);    // 告诉我通过多少吧
else
    result = 1;    // result还不能用?那老子不等了

if (result != 0)
    RenderRealObject(object);

像这样取得具体数值固然可行,但我们的工作并不建立在具体数值上。因此,可以进一步使用条件渲染(Conditional Render)。所有夹在glBeginConditionalRender(query, mode)和glEndConditionalRender(query, mode)之间的“渲染指令”将会在query得到0时全部跳过。

其中mode可以选GL_QUERY_WAIT和GL_QUERY_NO_WAIT,表示要不要等query统计完返回值。如过不等,则若result尚未available时,后续渲染指令就会无条件执行。因此,上述代码还能再优化:

// code 3: 老子都不用取回来
glGenQueries(1, &query);
glBeginQuery(GL_SAMPLES_PASSED, query);
RenderSimplifiedObject(object);
glEndQuery(GL_SAMPLES_PASSED);

// 条件渲染
glBeginConditionalRender(query, GL_QUERY_NO_WAIT);    // 根据query取得的值决定接下来的渲染:若还没取到值则无条件渲染
RenderRealObject(object);
glEndConditionalRender();

像这种统计采样点的query,叫做Occlusion Queries。

 

### 回答1: OpenGL蓝宝书PDF是指《OpenGL超级宝典》一书的电子版本,主要介绍了OpenGL图形学编程的基础知识和开发技巧。 OpenGL是一种跨平台的图形库,可以用于开发高性能的2D和3D图形应用程序。《OpenGL超级宝典》是一本经典的OpenGL教材,适合初学者和有一定OpenGL基础的开发者学习和参考。 这本书的PDF版本提供了一种便捷的阅读方式,可以随时随地通过电脑、平板或手机进行学习。相比于传统的纸质书籍,PDF版本的《OpenGL超级宝典》具有以下优势: 1. 可随时复制和搜索:PDF格式的书籍可以方便地进行复制和搜索,使得我们可以快速找到我们需要的内容,并方便地进行引用和参考。 2. 纸质书籍的替代品:PDF版本的书籍不占用实体空间,而且可以通过电子设备随时携带,方便在任何时间、任何地点进行学习和阅读。 3. 交互性强:PDF格式的书籍还可以添加书签、注释和标记,方便读者进行个性化的标记和笔记,更好地帮助记忆和理解。 总之,《OpenGL超级宝典》PDF版本是一种便捷、高效的学习OpenGL图形学编程的工具,通过这本书,读者可以系统地学习OpenGL的基础知识和开发技巧,从而提高自己在图形学编程领域的能力。 ### 回答2: OpenGL蓝宝书是一本关于OpenGL编程的经典教材,适合初学者和有一定编程基础的开发者。本书全面介绍了OpenGL的基础知识和常用编程技巧,并提供了大量的代码示例和实践项目。 这本书的PDF版本提供了方便的电子阅读方式,读者可以随时随地学习和实践OpenGL编程。使用PDF格式的优点是可以根据需要进行搜索、标注、复制和打印,在学习过程中方便查阅和注释,提高学习效率。 《OpenGL蓝宝书》的内容涵盖了OpenGL的基础知识,包括顶点和片元着色器、图元绘制、纹理映射、新的OpenGL特性等。此外,该书还介绍了OpenGL的高级技术,如光照、阴影、透明度、几何着色器等,帮助读者掌握更复杂的图形渲染技术。 这本书对于学习OpenGL编程的人来说是一部非常有价值的参考资料。它通过清晰的逻辑结构和易于理解的语言,帮助读者理解和掌握OpenGL的核心概念和编程技巧。同时,书中提供的示例代码和实践项目可以帮助读者巩固所学知识,并进一步探索OpenGL的应用。 总的来说,《OpenGL蓝宝书》的PDF版本是一种方便快捷的学习OpenGL编程的方式,可以满足读者在不同场合和需求下的学习和实践需求。无论是初学者还是有一定经验的开发者,都可以从中获得宝贵的知识和经验。 ### 回答3: OpenGL蓝宝书是一本经典的OpenGL编程指南,全书详尽地介绍了OpenGL的基础知识和编程技巧。这本书的完整版可以在网上找到PDF格式的电子书。通过阅读OpenGL蓝宝书,我们可以了解到OpenGL的底层原理、渲染管线以及各种常用的绘图和渲染技术。 OpenGL是一种跨平台的图形编程接口,它可以用于开发2D和3D图形应用程序。蓝宝书从基础概念开始,逐步介绍OpenGL的各个方面,包括顶点缓冲对象、着色器、纹理映射、光照等。通过例子和代码实践,读者可以深入理解OpenGL的工作原理,并学会如何使用OpenGL进行图形渲染。 OpenGL蓝宝书的PDF版本提供了便捷的学习方式。电子版本便于阅读和搜索,可以随时随地进行学习。同时,通过电子书的书签和目录功能,读者可以方便地定位到自己感兴趣的章节和内容。此外,电子书的PDF格式可以在多个设备上使用,如电脑、平板电脑和手机等。 总之,OpenGL蓝宝书PDF是一本非常有价值的OpenGL学习资料,它为初学者提供了一个系统而又详细的学习路径,帮助读者深入理解OpenGL的基础知识和编程技巧。无论是对于想要学习图形编程的人来说,还是对于已经对OpenGL有一定了解的开发者来说,这本书都是一本非常值得阅读的指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值