关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
文章推薦指數: 80 %
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。
gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。
其中,x和y是当前片元的窗口 ...
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
cremesino
于 2009-04-2811:19:00 发布
27221
收藏
9
分类专栏:
代码珍珠:更好的编程实践
文章标签:
float
buffer
编程
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cremesino/article/details/4132088
版权
代码珍珠:更好的编程实践
专栏收录该内容
1篇文章
0订阅
订阅专栏
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。
gl_FragCoord是个vec4,四个分量分别对应x,y,z和1/w。
其中,x和y是当前片元的窗口相对坐标,不过它们不是整数,小数部分恒为0.5。
x-0.5和y-0.5分别位于[0,windowWidth-1]和[0,windowHeight-1]内。
windowWidth和windowHeight都以像素为单位,亦即用glViewPort指定的宽高。
w即为乘过了投影矩阵之后点坐标的w,用于perspectivedivide的那个值。
gl_FragCoord.z/gl_FragCoord.w可以得到当前片元和camera之间的距离。
参见FoginGLSLpage4。
gl_FragCoord.z是固定管线计算出的当前片元的深度。
它已经考虑了多边形偏移,并经过了投影变换。
它位于[0.0,1.0]之间。
如果用gl_FragColor=vec4(vec3(gl_FragCoord.z),1.0)将其可视化,多半会看到一片白。
这是由于变换的非线性,大多数点的深度都非常接近于1。
用gl_FragColor=vec4(vec3(pow(gl_FragColor.z,exp)),1.0)并将exp取为合适的值,就能看到从黑到白的深度变化了。
距离观察者近的颜色深,接近0.0;距离观察者远的颜色浅,接近1.0;这说明一直以来的右手坐标系在投影变换后变成了左手坐标系。
关于深度的变换和精确性参见OpenGLFAQ-12TheDepthBuffer。
根据GLSLangSpec.Full.1.30.08(p61),gl_FragCoord.z是固定功能计算所得的结果。
如果片元着色器不写gl_FragDepth,那么这个值将用在后续处理中。
OpenGLShadingLanguage提到(p104),即使将gl_FragCoord.z赋值给gl_FragDepth也不能保证产生和固定功能完全相同的值。
但是,可以保证相对正确。
加之片元着色器一旦写入gl_FragDepth,就必须保证在每个分支都有写入。
因此,如果一个着色器需要在某些条件下自己计算深度,其它条件下的正确做法就是gl_FragDepth=gl_FragCoord.z。
在OpenGL的固定管线中,深度坐标是在视口变换期间变换到glDepthRange指定的范围之内(OpenGL编程指南-原书第五版,88页)。
视口变换也就是光栅化(Rasterization),在进行到片元着色器的时候自然已经编码完毕了。
自行计算片元深度可以用下面的方法(参考OpenGLFAQ-12TheDepthBuffer):
//VertexShader
varyingvec4position;
voidmain(void)
{
position=gl_ModelViewMatrix*gl_Vertex;
gl_Position=ftransform();
}
//FragmentShader
uniformfloatzFar;
uniformfloatzNear;
varyingvec4position;
voidmain()
{
floatzDiff=zFar-zNear;
floatinterpolatedDepth=(position.w/position.z)*zFar*zNear/zDiff+0.5*(zFar+zNear)/zDiff+0.5;
gl_FragColor=vec4(vec3(pow(interpolatedDepth,15.0)),1.0);
}
这样计算出的深度与gl_FragCoord.z基本一致。
cremesino
关注
关注
6
点赞
踩
5
评论
9
收藏
打赏
扫一扫,分享内容
点击复制链接
专栏目录
OpenGL入门教程(精).pdf
01-27
OpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdfOpenGL入门教程(精).pdf
glsl指定片段深度_深度学习的历史-通过6条代码片段进行探索
cumian8165的博客
07-15
191
glsl指定片段深度byEmilWallner埃米尔·沃尔纳(EmilWallner)
深度学习的历史-通过6条代码片段进行探索(TheHistoryofDeepLearning—ExploredThrough6CodeSnippets)
Inthisarticle,we’llexploresixsnippetsofcodethatmade...
评论 5
您还未登录,请先
登录
后发表或查看评论
学习ShaderToy第一天:glsl语言内置函数gl_FragCoord
热门推荐
jinghouxiang的专栏
02-26
1万+
运行环境:Android
opengles版本:2.0
3D引擎库:Rajawali3D
ShaderToy上用的shader语言为glsl,效果是用webgl跑的,而webgl封装了opengles, 所以ShaderToy上的例子同样使用于Android端。
ShaderToy基本上都是用fragmentshader对栅格化后的像素进行处
关于OpenGL+GLSL深度贴图采样
weixin_30481087的博客
12-26
228
作者:Nin+.Lee
邮箱:[email protected]
*本文属原创,转载请注明出处。
在GLSL中,存在着sampler2D和sampler2DShadow两种2D贴图采样器。
在对一个深度贴图(指内部格式为GL_DEPTH_COMPONENT或GL_DEPTH_STENCIL的贴图)进行采样时,可以使用前述两种2D贴图采样器其中的一种进行采样。
对两种2D贴图采样器取舍...
GLSLDepth-RayMarching(一)拓展片段丢弃与深度计算
qq_26821643的博客
08-31
994
版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_26821643,未经同意不得转载。
以下内容需要读者理解熟悉Opengl的矩阵运算以及掌握Shader编程基础。
RayMarching(光影投射)
什么是RayMarching?简而言之,它是一种基于着色器语言的体渲染技术。
它能够突破三角面片渲染规则,渲染出更多的表面细节,例如结合一些噪...
gl_FragCoord的含义
fatcat123的博客
01-06
7121
gl_FragCoord表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个vec4类型的变量(x,y,z,1/w),其中x,y是当前片元的窗口坐标,OpenGL默认以窗口左下角为原点,在着色器中通过布局限定符可以重新设定原点,比如窗口左上角为原点origin_upper_left,窗口大小由glViewport()函数指定。
x,y默认是像素中心而非整...
关于gl_FragCoord的理解
qq_39503511的博客
01-30
844
关于gl_FragCoord的理解概述
概述
记录一下在使用gl_FragCoord的一些知识点
先上shader来看效果
letshader={
vs:`
voidmain(){
gl_Position=projectionMatrix*viewMatrix*modelMatrix*vec4(position,1.0);
}
`,
fs:`
//屏幕尺寸
uniformvec2
OpenGL-Shader
07-09
共六章
1.基础章节,从Shader1.0版本到新的4.5版本,介绍每一个版本中特性的用法;
2.TesslattionShader应用/基础案例分析
3.GemotryShader应用/基础案例分析
4.ComputeShader应用/基础案例分析
5.通过大量案例讲解分析/结合新特性,介绍用法
6.性能调优,如果借助shader加速应用,让你的程序支撑百万级别的场景对象轻松应对
第二十课,高级GLSL
Elsa的迷弟
11-03
75
内建变量
已知
gl_Position顶点着色器的裁剪空间输出位置向量
FragColor片元着色器的片元输出颜色值
未知
顶点着色器变量
gl_PointSize
GLSL定义了一个叫做gl_PointSize输出变量,它是一个float变量,你可以使用它来设置点的宽高(像素)。
在顶点着色器中修改点大小的功能默认是禁用的,启用它需要:
glEnable(GL_PROGRAM_POINT_SIZE);
我们可以通过OpenGL的glPointSize函数来设置渲染出来的点的大小
voidg
GLSL和深度测试解释
小小幸
11-08
2516
depthtesting(深度测试)的功能,启动它,OpenGL就可以跟踪在z轴上的像素。
这样它只会在那个像素前方没有东西时,才会绘画这个像素。
在OpenGLES2.0的世界,在场景中渲染任何一种几何图形,你都需要创建两个称之为“着色器”的小程序。
着色器由一个类似C的语言编写-GLSL
这个世界有两种着色器(Shader):
Vertexshaders–在你的
opengl深度详解_什么是OpenGL中的深度、深度缓存、深度测试?
weixin_30122219的博客
12-24
308
深度其实就是该象素点在3d世界中距离摄象机的距离,深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度测试决定了是否绘制较远的象素点(或较近的象素点),通常选用较近的,而较远优先能实现透视的效果!!!2)Z值(深度值)、Zbuffer(深度缓存)下面先讲讲Z坐标。
Z坐标和X、Y坐标一样。
在变换、裁减和透视除法后,Z的范围为-1.0~1.0。
DepthRange映射指定Z坐标的变换,这与用于...
gl_FragCoord
啦啦啦啦
03-11
888
gl_FragCoord表示当前片元着色器处理的候选片元窗口相对坐标信息,是一个vec4类型的变量(x,y,z,1/w),其中x,y是当前片元的窗口坐标,OpenGL默认以窗口左下角为原点,在着色器中通过布局限定符可以重新设定原点,比如窗口左上角为原点origin_upper_left,窗口大小由glViewport()函数指定。
x,y默认是像素中心而非整...
理解glsl语言的gl_FragCoord与u_resolution
最新发布
popstarqq的博客
12-28
343
1概念
(1)u_resolution是画布尺寸,即代表画布宽高
(2)gl_FragCoord:是一个vec4类型的变量(x,y,z,1/w),其中x,y是当前片元的窗口坐标。
直译就是片元坐标
2结合例子理解
如下效果和代码
#ifdefGL_ES
precisionmediumpfloat;
#endif
//u_resolution(画布尺寸)
uniformvec2u_resolution;
voidmain(){
vec2st=gl_F
有关GLSL中的gl_FragCoord
开发游戏,辉煌全中国
04-15
7086
在研究阴影映射的时候,我发现了一个很有意思的变量,它可以代替我们自己使用的varying变量,给我们带来方便。
但是我们也需要了解它是如何计算的。
OpenGL-GLSL语言入门教程(1)
b站、微信公众号:一路狂飚的蜗牛
04-23
4131
目录
GLSL简介
GLSL的内建变量
顶点着色器变量
gl_PointSize
gl_VertexID
片段着色器变量
gl_FragCoord
gl_FragDepth
参考网站:LearnOpenGL
参考书籍:OpenGL编程指南第九版
GLSL简介
OpenGL着色语言(OpenGLShadingLanguage)是用来在OpenGL中着色编程的语言,也即开发...
GLSL详解(高级篇)
u010029439的博客
03-22
1456
7.预处理
GLSL中预处理指令的使用也跟C语言的预处理指令相似。
以下代码是宏及宏的条件判断:
1
2
3
4
5
6
7
8
#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
注意与C语言中不同,宏不能带参数定义。
使用#if,#else和#elif可以用来判断宏是否被定义过。
以下是一些预先定义好的宏及它们的描述:
1
2
3
4
__LIN...
WebGL着色器内置变量gl_PointSize、gl_Position、gl_FragColor、gl_FragCoord、gl_PointCoord
u014291990的博客
11-17
1万+
WebGL着色器内置变量
本文是WebGL教程(电子书)的2.7节内容
着色器语言在GPU的着色器单元执行,javascript语言、C语言在CPU上执行,任何一种语言的语法规则,整体设计都和它执行的硬件有一定的关系,GPU和CPU执行程序的硬件单元既有相同点,也有不同点。
这里谈到GPU和CPU不是为了讲解硬件,而是为了提醒大家,学习着色器语言有些语法可以参考javascript、C等执行在CPU...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
cremesino
CSDN认证博客专家
CSDN认证企业博客
码龄14年
暂无认证
11
原创
38万+
周排名
129万+
总排名
6万+
访问
等级
668
积分
7
粉丝
6
获赞
7
评论
14
收藏
私信
关注
热门文章
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
27217
定制自己的BibTexStyle(bst)
13679
LaTeX中的图片和转换工具
5699
在Word2007中使用BibTex生成引文:Bibtex4Word
4420
Word2007:查找:寻找英文文档中的非法字符
3620
分类专栏
代码珍珠:更好的编程实践
1篇
代码琥珀:遇到的和解决的
杂物盒子:用软件的小技巧
7篇
最新评论
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
nja_123:
我在webgl中使用gl_FragDepth出错了
gl_FragDepth':undeclaredidentifier
是不支持吗
解决ResourceCompilerFatalErrorRC1107invalidusage;useRC/?forHelp
Summer006:
thankssolvemyproblem
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
zatman:
回复fterly1204:http://en.wikipedia.org/wiki/Z-buffering,这里写得很清楚。
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
zatman:
[e03]多谢博主。
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
fterly1204:
回复fterly1204:[e08]实际上你的公式就是a+b/Z……
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
定制自己的BibTexStyle(bst)
在Word2007中使用BibTex生成引文:Bibtex4Word
在UbuntuServer上配置LAMP
2011年2篇
2010年3篇
2009年3篇
2008年3篇
目录
目录
分类专栏
代码珍珠:更好的编程实践
1篇
代码琥珀:遇到的和解决的
杂物盒子:用软件的小技巧
7篇
目录
打赏作者
cremesino
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:--)
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口 ...
- 2gl_FragCoord 的含义 - 知乎专栏
gl_FragCoord.w 是裁剪空间clip.w 的倒数即1/clip.w , 由上面的透视投影矩阵的推导过程可以看出,为了凑透视除法, clip.w 值就是眼坐标系z 值的负数,也 ...
- 3uniforms - The Book of Shaders
gl_FragCoord 存储了活动线程正在处理的像素或屏幕碎片的坐标。有了它我们就知道了屏幕上的哪一个线程正在运转。为什么我们不叫 gl_FragCoord uniform (统一值)呢?
- 4gl_FragCoord - OpenGL 4 Reference Pages - Khronos Group
Available only in the fragment language, gl_FragCoord is an input variable that contains the wind...
- 5GLSL. Can someone explain why gl_FragCoord.xy ...
First, gl_FragCoord.xy are screen space coordinates of current pixel based on viewport size. So i...