关于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 ...
随机推荐
- bundle install rake-10.4.2
这个是由于被墙了的原因,提供一个不用FQ解决的方法 淘宝做了一个gem镜像,地址是http://ruby.taobao.org/ 为什么有这个? 由于国内网络原因(你懂的),导致 rubygems. ...
- phonegap 新窗口 WebView
自定义WebView窗口打开 import com.ap.work.QuickWeb public class QuickPlugin extends CordovaPlugin { /** * 新开 ...
- java线性表学习笔记(二)
链表中的每一个元素都包含一个称为节点的结构,每向链表中增加一个元素,就会产生一个与之相关的节点,每个节点与它相邻的节点相连接(这是基础吧,不过在看c的时候没认真看,呼). 定义节点类如下(使用了泛型, ...
- OperateParticleWithCodes
[OperateParticleWithCodes] Listing 6-6 shows how you might configure an emitter’s scale property. Th ...
- POJ 3304 Segments (直线和线段相交判断)
Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7739 Accepted: 2316 Descript ...
- 用PyInstaller把Python代码打包成单个独立的exe可执行文件
之前就想要把自己的BlogsToWordpress打开成exe了.一直没去弄. 又看到有人提到python打开成exe的问题. 所以打算现在就去试试. 注:此处之所有选用BlogsToWordpres ...
- 8.3 LIS LCS LCIS(完结了==!)
感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸 地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28195#overview 密码 ac ...
- socket 连接,使得地址马上可以重用
/* 使地址马上可以重用 */ ...
- android 小方法
小方法 1.获取屏幕分辨率: public class BaseTools { public static int getWindowWidth(Context context) { // 获取屏幕分 ...
- Oracle 将不同列的值拼接成一个 字符串
利用拼接操作符“||”或者 CONCAT('','')函数,将不同列的值 拼接成一个 字符串 -- 方法一:推荐 SELECT S.TEAM ||'**'|| S.NAME ||'**'|| S. ...