关于OpenGL+GLSL深度贴图采样
作者:Nin+.Lee
* 本文属原创,转载请注明出处。
在GLSL中,存在着sampler2D和sampler2DShadow两种2D贴图采样器。在对一个深度贴图(指内部格式为GL_DEPTH_COMPONENT或GL_DEPTH_STENCIL的贴图)进行采样时,可以使用前述两种2D贴图采样器其中的一种进行采样。对两种2D贴图采样器取舍,与贴图对比模式(Texture Comparison Modes)有关。
OpenGL 4.2提供了两种贴图对比模式,分别为普通对比模式(GL_NONE)和引用到贴图对比模式(GL_COMPARE_REF_TO_TEXTURE)。可以通过设置贴图参数GL_TEXTURE_COMPARE_MODE来改变比较模式,改参数的默认值是普通对比模式(GL_NONE)。
如果选择普通对比模式(GL_NONE)作为当前对比模式,则在GLSL着色器脚本中,必须使用sampler2D作为贴图采样器。此时,深度贴图会像颜色纹理贴图一样进行采样。用于采样的贴图坐标是一个2D的向量,采样的结果是一个4D向量,每个分量都包含着同样的单精度深度值。
如果选择引用到贴图对比模式(GL_COMPARE_REF_TO_TEXTURE)作为当前对比模式,则在GLSL着色脚本中,必须使用sampler2DShadow作为贴图采样器。此时,用于采样的贴图坐标是一个3D向量。这个3D向量的x分量和y分量用于查找深度贴图中的深度值,而z分量将作为参考值(Reference Value)和找到的深度值进行深度测试。测试的结果取决于比较函数。可以通过设置贴图参数GL_ TEXTURE_COMPARE_FUNC来改变比较函数,默认值是GL_LEQUAL。如果测试通过,则采样结果返回1.0,否则返回0.0。如果深度贴图使用了线性过滤,那么返回值是实现相关的。但是返回值应该在[0, 1]区间上。
在编程时,如果未按照上述原则正确使用相应的贴图采样器和贴图比较模式,将产生未定义的结果。
注意:如果深度贴图的内部格式是归一化整数时,那么其内部的深度值会被映射到[0, 1] 区间上。用于比较的参考值必须被映射到[0, 1] 区间后,再和深度贴图中保存的深度值比较才有意义。
参考文献
- OpenGL Wiki, http://www.opengl.org/wiki/Sampler_Object#Comparison_mode
- The OpenGL Shading Language Specification Version 4.2, p.139, 8.9 Texture Functions
- The OpenGL Graphics System: A Specification Version 4.2, p.260, 3.9.17 Texture Comparison Modes
关于OpenGL+GLSL深度贴图采样的更多相关文章
- (转)OpenGL学习——立方体贴图
转自:https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/06%20Cubemaps/ 我们之前一直使用的是2 ...
- android ndk调用OpenGL 实现纹理贴图Texture
android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39 CSDN博客 原文 http://blog.csdn.net/chrisfxs/a ...
- OpenGL/GLSL数据传递小记(3.x)(转)
OpenGL/GLSL规范在不断演进着,我们渐渐走进可编程管道的时代的同时,崭新的功能接口也让我们有点缭乱的感觉.本文再次从OpenGL和GLSL之间数据的传递这一点,记录和介绍基于OpenGL3.x ...
- Unity内生成深度贴图
https://qiita.com/bokkuri_orz/items/08cbaeae6a34fed7f903 https://www.cnblogs.com/sifenkesi/p/4721649 ...
- Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
一.概念 一般说来,纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture).当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实.当前流行的图形系统中,纹理绘制已经成为 ...
- OpenGL之纹理贴图(Texture)
学习自: https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ 先上一波效果图: 实际上就是:画了一个矩形,然后 ...
- GLSL纹理贴图 【转】
转载:http://blog.csdn.net/hgl868/article/details/7872466 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...
- opengl学习笔记(四):openCV读入图片,openGL实现纹理贴图
在opengl中实现三维物体的纹理贴图的第一步就是要读入图片,然后指定该图片为纹理图片. 首先利用opencv的cvLoadImage函数把图像读入到内存中 img = cvLoadImage(); ...
- OpenGL/GLSL数据传递小记(2.x)(转)
本篇记录一下关于OpenGL程序中绑定各种GLSL变量的一些注意问题(有些是近期编写代码感受强烈的).以供参考.——ZwqXin.com 本文来源于 ZwqXin (http://www.zwqxin ...
随机推荐
- 组建你自己的Theme,组件你的Style
Andorid-Style,组建你自己的Theme,组件你的Style 前言: 今天,尝试了一个新的Demo,也尝试深入学习,话不多说,看一下,这个Demo如何实现的自定义主题与组件Style是如何绑 ...
- 怎样下载完整的Spring包
自从3.2版本以后,Spring不再提供包含所有库的文件下载了只有Sping自身的最基本库,所依赖的东西需要自己搞定首先, 这个链接 包含了Spring自身和所用到的所有东西 这个 是上述链接的说 ...
- cocos2d-x3.2下获取文件夹下所有文件名的方法
这里提供一个函数获取文件夹下所有文件名的方法,直接上代码了. 原文地址:http://blog.csdn.net/qqmcy/article/details/36184733 // // Visib ...
- jQuery Callback 函数
@(编程) Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题 许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数. ...
- RAID对硬盘的要求及其相关
Raid 0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余. Raid 1:只能用两块硬盘,两块硬盘的数据互为镜像(写慢,读快),一块磁盘冗余. Raid 5:至少需要3块硬盘,一块磁盘冗余. ...
- MEF(Managed Extensibility Framework)依赖注入学习
MSDN官方资料,并且微软还提供了SimpleCalculator sample学习样例 http://msdn.microsoft.com/en-us/library/dd460648(v=vs.1 ...
- CCF 201312-2 ISBN号码 (水题)
问题描述 每一本正式出版的图书都有一个ISBN号码与 之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后 ...
- 【Python实战02】共享Python代码到PyPI社区
之前学习了Python的列表,以及编写了一个函数来进行列表的输出,这次我们就继续来学习如何把我们已经编写好的代码共享到PyPI社区,这里以上篇文章中编写的print_lol函数为例. 函数转换为模块 ...
- 使用XCopy发布网页
链接:https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument113245 In this lesson, yo ...
- Painter 12安装教程
1 首先打开激活器 2 开始安装,点击我有序列码,把激活器中的序列码粘贴到安装文件中. 3 安装完成后,点击activate option选项,点击电话联系: 激活成功