关于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 ...
随机推荐
- CSS width:100%和width:auto的区别
width:100%和width:auto的区别 width:auto比较聪明,如果margin已经左右占去10px的空间,那么width给的值就是580px. <style> div{ ...
- HDU1243:反恐训练营
题目链接:反恐训练营 题意:本质上是求最大公共子序列,然后加上一个权值 分析:见代码 //公共子序列问题 //dp[i][j]表示前s1的前i个与s的前j个匹配得到的最大公共子序列 #include& ...
- 让git忽略ignore所有文件,只对某些文件进行版本控制
*.c !frob_*.c !custom.c 或者:*!*/ # 这个的意思是不忽略目录.否则目录被忽略了之后,它里面的所有文件都忽略了!*.c!*.cc!*.cpp!*.cxx 也就是先忽略所有文 ...
- CameraComponent Quality
CameraComponent1.Quality := TVideoCaptureQuality.HighQuality; procedure TCameraComponentForm.Set720p ...
- 使用python通过SSH登陆linux并操作
用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的. 代码: >>> import paramiko ...
- hdu 1171 Big Event in HDU(多重背包+二进制优化)
题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...
- iOS Framework lipo报错 lipo: can't map input file
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ ...
- SQL Server中行列转换
典型实例 一.行转列 1.建立表格 ifobject_id('tb')isnotnulldroptabletb go createtabletb(姓名varchar(10),课程varchar(10) ...
- 固定分隔符字符串与数组互转及ArrayList与数组(Array)互转
1.字符串转数组 这个相信多数人都会常用,string.split方法,分隔符可以为多个.详细信息参见MSDN string[] actionCfgs = _para.Split(new char[] ...
- JS阻塞的问题
常见问题 http://www.zhihu.com/question/23101413 阻塞特性: JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任 ...