OpenGL着色器中原六仔平台搭建程序解析--3D拾取

3D拾取指的是中原六仔平台搭建论坛:haozbbs.com Q1446595067 将鼠标在屏幕上点击的位置匹配到3d游戏场景中的某个图元上,该图元投影到屏幕上的像素恰好就是鼠标点击的像素。3D场景在很多交互情境中有重要作用,使开发者的应用能够将用户的点击对应到场景空间中的物体上。例如:用户可以通过点击选中某个物体或者物体的某一部分进行删除等后续操作。在这个教程中的demo中,我们将渲染几个物体,并且展示如何使用红色标记选中的三角形图元使其突出显示。

为了实现3D拾取,我们将用到第23章阴影贴图教程中介绍的OpenGL特性:帧缓存对象(FBO)。之前我们使用FBO只用作深度缓冲,因为我们感兴趣的是从不同角度来比较像素的深度。而在3D拾取中,我们将既使用深度缓冲又要使用颜色缓冲,来存储渲染的三角形的索引值。

3D拾取背后的技巧很简单,对每一个三角形在程序运行时附加一个索引,并让片段着色器输出每个像素所在三角形的索引值。结果是我们将得到一个颜色缓冲,但是并不包含颜色值,而是像素所在的图元的索引值。当鼠标点击在窗口上,我们将根据鼠标的点击位置来获得这个索引并将这个三角形渲染成红色。由于有深度测试,所以能够保证当片元之间相互覆盖时也可以得到最顶部的片元的索引(离相机最近的)。

上面就是3D拾取的概念和原理了,下面在进入代码之前,我们需要做一些设计上的决策。例如,如何处理多物体的情况?如何处理一个物体多次draw call渲染的情况?我们需要为每个物体设置递增的图元索引使场景中每一个图元都有唯一的索引,还是为每一个物体都重置其索引?

这篇教程的代码采用了一种普遍的方法,可以根据需要进行简化,会为每一个像素渲染三级索引:

第一级是像素所在物体的索引值,场景中的每一个物体都会得到一个唯一的索引;
物体的draw call的索引,这个索引会在开始渲染新物体时重置;
每个draw call中图元的索引值,每次新的draw call开始时该索引会重置。

在我们读取每个像素的索引时实际上我们就将获取到上面的三级索引数据了。之后我们将对特定的图元进行相应的处理。

我们需要渲染场景两次。一次叫做“纹理拾取”,纹理包含图元索引数据。另一次则直接渲染到实际的颜色缓冲。因此,住渲染循环会有一个拾取的阶段和一个渲染阶段。

注:这里的demo中使用的蜘蛛模型来自于Asssimp的资源包。它包含多个VB,可以帮助我们测试这里的例子。
源代码详解

见原文。

原文地址:http://blog.51cto.com/13857087/2137650

时间: 2024-11-06 03:44:33

OpenGL着色器中原六仔平台搭建程序解析--3D拾取的相关文章

mysql实现秒值转换中原六仔平台搭建

需求:求一个人的在线时间,中原六仔平台搭建统计出来的为秒值,需转换成指定格式显示,企 娥:217 1793 408 开始想找有什么函数可以这么做,结果试了好几个 不稳没起作用,还是得通过计算concat 拼接 整除3600 取得小时数,余3600 整除 60 取得分钟 回顾mysql的 整除方法 一. 整除:div 5 div 2 = 2; 二. 取余:mod 5 mod 2 = 1; 三. 四舍五入:round round(1.5) = 2; sql如下: SELECT concat(conc

中原六仔平台搭建实时同步系统

Rsync 优点中原六仔平台搭建Q1446595067 rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期地备份文件服务器数据到远程服务器上,对本地磁盘定期进行数据镜像等.Rsync 不足 随着应用系统规模的不断扩大,对数据的安全性和可靠性提出了更高的要求,rsync便暴露出了很多不足之处.首先,rsync同步数据时,需要扫描所有文件后进行比对,然后进行差量传输.如果文件数量达到了百万量级及以上时,扫描文件就非常耗费时间,有时还会

《交互式计算机图形学 基於OpenGL着色器的自顶向下方法(第6版) 》代码运行问题及其解决

上一篇文章,笔者提到了红宝书第8版的代码编译运行问题,想必大家已经知道我看过红宝书了. 然而,笔者竟然看不懂,这是因为笔者并不知道OpenGL的历史.原来有古代OpenGL和现代OpenGL之分,古代OpenGL使用固定功能管线,现在已经被废弃(尽管还能用),而现代使用可编程管线. 由于笔者在网上搜索一通,见到怎么OpenGL的代码有两种风格,到了现在才搞懂.原来OpenGL在第8版之前都是讲的固定功能管线,到了第8版立即转成了可编程管线.然而红宝书已经认定了你有一定的计算机图形学基础,因此介绍

Linux下常用的us六仔平台租用命令

修改文件或者目录的权限(us六仔平台租用) 企 娥:217 1793 408chmod 777 [文件名或者目录] //777分别表示user/group/other中的rwx 查看内存使用情况 top | grep opencv_test 查看opencv_test这个进程的内存使用情况(top命令就像window里的任务管理器[动态的]) 程序后台运行 在执行命令后面加个& e.g. ./opencv_test & 查看文件内容的命令 1cat 由第一行开始显示内容,并将所有内容输出2

Nginx源码分析之中原六仔源码修复

Nginx的配置结构复杂至极,比Nginx其他模块的都复杂,想要彻底搞清楚,还需要下功夫.下面是个人的一些理解.中原六仔源码修复(企 娥:217 1793 408) if (cmd->type & NGX_DIRECT_CONF) {/"daemon" "worker_processes"等指令为NGX_DIRECT_CONF指令其实也是NGX_MAIN_CONF指令,但是先判断了NGX_DIRECT_CONF所以走这个分支*/conf = ((voi

WebGL中的OpenGL着色器语言

在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于GPU的着色器上,来完成对对象的渲染.GLSL在其中起着相当重要的作用,所以要玩好webgl,我们就得把GLSL搞懂,本文主要介绍shader的基础使用及组成. 整个管线处理过程: 1.指定几何对象 1.顶点数组(直接将顶点数据传送至shader里) 2.顶点索引(将顶点数据保存于缓冲区中,用索引来从

OpenGL学习日记-2015.3.5——Hello glsl(着色器)

过年前忍不住买了本新版的OpenGL编程指南,主要的目的还是为了系统的学习着色器编程,另外就是接触新版的OpenGL技术和思想.看了几页,就过年了QAQ.回来后也是各种不在状态,不想上班,不想工作,不想写代码...昨天终于强迫自己继续看书,也找回了些状态. 书本基础知识的全面性和权威性就不用说了,不过这个源代码就....这第一个例子照着代码来抄结果...我想应该是原来的代码一个参数错了,折腾了半天,代码分析是详说.主要是分析代码,有什么说什么,并没有全面的说明着色器的基本内容,想着在着色器的基础

OpenGL官方教程——着色器语言概述

OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) 将 Pertransformed Vertices (每一个待转换顶点) 传人 Programmable Vertex Processor (可编程的顶点处理器) 得到 Transformed Vertices (转换的顶点) 将 Transformed Vertices (转换的顶点) 传入 Pr

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译)

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译) (2012-12-24 13:22:17) 转载▼ 标签: it cocos2d opengl 着色器 渲染 翻译:弹涂鱼 PS:欢迎加入开发群:285275050 本文翻译自:http://www.raywenderlich.com/10862/how-to-create-cool-effects-with-custom-shaders-in-opengl-es-2-0-and-cocos2d-2-x#