关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算

文章推薦指數: 80 %
投票人數:10人

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币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?