关于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 ...
随机推荐
- TopFreeTheme精选免费模板【20130629】
今天给大家推荐9款最新精选的WordPress主题,它们涵盖了新闻.杂志.博客.房地产方面的主题.有些是商业模板,但现在都可以免费下载. GeoPlaces v4.6.2 – 来自Templatic的 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- [ZZ] C++ pair
Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...
- HDU-3401 Trade 单调队列优化DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 DP方程容易想出来,f[i][j]表示第i天拥有j个股票的最优解,则: 1.不买不卖,f[i][ ...
- DD_belatedPNG,解决 IE6 不支持 PNG-24 绝佳解决方案
png24在ie下支持透明.终于找到下面的可行办法: 我们知道 IE6 是不支持透明的 PNG-24 的,这无疑限制了网页设计的发挥空间. 然而整个互联网上解决这个 IE6 的透明 PNG-24 的方 ...
- 使用google map v3 api 开发地图服务
Google Map V3 API 学习地址: http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/article ...
- hdu 2199 Can you solve this equation?(高精度二分)
http://acm.hdu.edu.cn/howproblem.php?pid=2199 Can you solve this equation? Time Limit: 2000/1000 MS ...
- C#POP3协议实现SSL验证登陆GMAIL
最近在折腾POP3协议,登陆pop.qq.com和pop.163.com没有什么问题,于是就想着登陆pop.gmail.com,结果失败了.经查,发现gmail的pop3端口不是110,而是995.于 ...
- (剑指Offer)面试题19:二叉树的镜像
题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 输 ...
- eclipse设置默认编码格式为UTF-8
需要设置的几处地方为: Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 Window ...