Vertex Texture Fetch(VTF) Fragment Texture Fetch ( FTF )

在vertex shader里也可以检索纹理。我本来觉得这没什么好奇怪的,因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture2D这类函数不是fragment shader专用的,倒还有texture2DLod这种在vertex shader里专用的(后面一句是马后炮~),只是我不知道怎么用,在哪里用,以及更重要的:为什么要用。

为什么要在vertex shader里检索纹理。

都知道,纹理里的一般是一幅图像,无论是外部导入的还是通过FBO等手段渲染到的。既然如此,有意义的当然是图像里的每一个像素啦,通过纹理坐标检索纹理中的像素打印到屏幕某个地方,并可控制细节程度……反映在GPU编程中,一般就是把当前绑定的纹理的纹理单元(默认为0)传送给Fragment Shader作为sampler,在vertex shader里用gl_TexCoord[0] = glMutiTexCoord0这样的语句,获取固定流水线中为每个顶点设置好的纹理坐标(顶点纹理索引,即glMutiTexCoord0),赋给本质为varying的gl_TexCoord[0],让它带着纹理坐标在光栅化过程中插值——对应每个像素点拥有属于它的插值后像素纹理索引(gl_TexCoord[0]),以此作为参数用texture2D类函数检索纹理sampler。

直接在顶点阶段就检索纹理意义何在?获得的只是那些顶点的纹理坐标检索出的“孤立”像素值而已。

你认识吗?GPGPU。

[gpgpu.org]

GPGPU(General Purpose Graphic Process Unit,通用目的图形处理单元),是应用GPU的高速并行能力和浮点运算能力进行科学计算等SIMD类型[单指令多数据]的应用。在这里,GPU-shader不仅仅着眼于图形。而GPGPU的一个重要概念就是:纹理 =  数组。是的,为什么不可以呢?纹理确实就是数组啊。我们能传入shader的只有具体的数值,bool,int,float,vec,matrix,其中最大的matrix4也只有16个量。那么如果我们要把大量的数据传入shader,譬如一个巨大的float数组,怎么办呢?对啊,用纹理!这时候,纹理内部每个数值不再是像素的值,而是数组的数据项。我们只是通过纹理这种灵活的媒介,让数据“进入”GPU的视野,让shader可以对这些数据项变量进行访问和操作。

顺带一提,现在科学计算领域已经进入GPGPU的进化时代 -CUDA时代了。好吧,不要扯远了。

既然纹理 = 数组, VTF顶点纹理拾取的存在就不言自明了:其实不是在拾取含有图像像素信息的那个纹理,而是在拾取含有顶点数据信息的那个“数组”啊!在这里,数组的索引就是顶点纹理坐标……看例子:

//RenderMonkey:
//Vertex Program
varying vec4 vertColor;
uniform sampler2D baseMap;void main( void )
{//vertColor = texture2D(baseMap, gl_MultiTexCoord0.xy);  与下句等价  vertColor = texture2DLod(baseMap, gl_MultiTexCoord0.xy, 0.0);        vec4 pos = gl_ModelViewMatrix * (gl_Vertex) ;gl_Position = gl_ProjectionMatrix * pos ; 
}//Fragment Program
varying vec4 vertColor;void main( void )
{gl_FragColor = vertColor;
}

这个例子是说明:诶?原来Vertex Shader里也可以做纹理拾取口牙!顺带一提,这里用texture2D,和用“texture2DLod+尾参数[细节参数LOD] = 0.0”的效果是一样的:
 

www.zwqxin.com  VTF 顶点纹理拾取
(对比用。这是FTF,传统的fragment shader获取纹理)
www.zwqxin.com  VTF 顶点纹理拾取
(这是VTF,顶点纹理拾取,也就是上面代码的产物,对比两图哈)

纹理只是普通的纹理。只是为了证明VTF能行- -。把顶点纹理的值做插值,预料最后的结果类似于顶点颜色插值,三角片元的颜色在三角的三顶点所获得的纹理颜色间进行线性插值,得出如此“重过渡味+模糊”的怪象(嘛~这纹理即使是那FTF出来的也是怪象)。然后测试texture2DLod这个函数,把最后的LOD参数增大调为0.4:

www.zwqxin.com  VTF 顶点纹理拾取

lod是细节参数,这跟以前的FTF(PTF)差不多。好吧,换张纹理后,再用VTF做点更有趣的:

//RenderMonkey: 
//Vertex Program 
varying vec4 vertColor; 
uniform sampler2D baseMap; void main( void ) 
{ vertColor = texture2DLod(baseMap, gl_MultiTexCoord0.xy, 0.0);vec4 offset = vec4(0.0);if(gl_Vertex.z > 0.0)offset = vertColor;else if(gl_Vertex.z < 0.0)offset = vec4(1.0)-vertColor;vec4 pos = gl_ModelViewMatrix * (gl_Vertex+ offset) ; gl_Position = gl_ProjectionMatrix * pos ; 
} //Fragment Program 
varying vec4 vertColor; void main( void ) 
{ gl_FragColor = vertColor; 
}

  能猜到结果变成这样吗?哈,VTF出来的vertColor果然充满力量:

www.zwqxin.com  VTF 顶点纹理拾取

另外一个例子则用VTF做点有意义的事情。还记得高度图纹理吗?(我在[Terrain Texture-Array Demo] 里也用到过~)

//RenderMonkey:  
//Vertex Program  
varying vec2  texCoord;
uniform sampler2D Texture0;void main(void)
{vec4 vcol =  texture2D( Texture0, gl_MultiTexCoord0.xy);float gray = 0.2990*vcol.r + 0.5870*vcol.g + 0.1140*vcol.b;vec4 pos =  gl_Vertex;pos.z = pos.z * (1.0 - 5.0*gray);gl_Position = gl_ModelViewProjectionMatrix * pos;texCoord = gl_MultiTexCoord0.xy;   
}//Fragment Program  
uniform sampler2D Texture0;
varying vec2 texCoord;void main(void)
{gl_FragColor = texture2D( Texture0, texCoord );
}

这里本来只有一个平整的网格,和一张类似高度图的纹理。运用VTF把顶点对应的纹理坐标的像素值拉出来转化为灰度(转化法同见[基于亮度的图像二值化处理] ),并转化为该网格顶点的“高度”。最后的纹理只是平铺上去(那不是阴影哦)。看,灰度高的地方对应的高度高,灰度低的地方对应的高度低。这就是高度场啊,这就是VTF最典型的应用啊!

www.zwqxin.com  VTF 顶点纹理拾取

在Vertex Shader里面,通过纹理坐标的检取,VTF获取的是真正的“高度值”数据……只是这些数据被储存在一张纹理上罢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向.NET开发人员的Dapr——机密

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理面向.NET开发人员的Dapr——发布和订阅面…

没找到rpm命令_Mysql的命令总结和PyMysql

Author&#xff1a;RunsenDate&#xff1a;2019/2/27作者介绍&#xff1a;Runsen目前大三下学期&#xff0c;专业化学工程与工艺&#xff0c;大学沉迷日语&#xff0c;Python&#xff0c; Java和一系列数据分析软件。导致翘课严重&#xff0c;专业排名中下。.在大学60%的时间&a…

银联再发道歉声明;印度发布吃鸡禁令;甘肃全省校园禁售辣条;波音面临50亿罚款;女子撕扯民警头发罚两百;这就是今天的大新闻。...

今天是3月18日农历二月十二今天星期一最近天气多变大家出门注意穿衣带伞下面是今天的大新闻银联再发道歉声明&#xff08;央视财经&#xff09;315晚会就“闪付”功能存在“隔空盗刷”的风险对广大消费者进行消费预警。3月16日下午&#xff0c;银联回应此事&#xff0c;表示隔空…

面向.NET开发人员的Dapr——可观察性

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理面向.NET开发人员的Dapr——发布和订阅面…

antd request 通过jsessionid传参数_Umi-request源码阅读

最近参照antd-pro脚手架进行开发&#xff0c;因此接触到了umi-request。umijs/umi-request​github.comumi-request对fetch进行了封装&#xff0c;简化了api的使用&#xff0c;结合了fetch和axios的特点&#xff0c;具体可参照umi-request的readme介绍。文件结构核心文件夹为sr…

随手能做194个实验,不呆板,轻松撬动大智慧

▲数据汪特别推荐点击上图进入玩酷屋玩具和学习看似是两个对立的东西&#xff0c;孩子天性爱玩&#xff0c;家长却希望孩子能多学习。不一定非要啃课本才能汲取知识&#xff0c;有时候&#xff0c;在轻松有趣的游戏中也能学到课堂上学不到的知识。让学习变得有趣、高效——给孩…

面向.NET开发人员的Dapr——绑定

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理面向.NET开发人员的Dapr——发布和订阅Th…

每日一笑 | 为什么Python比Java更受欢迎?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

传递集合对象_面试必备——Java集合框架

Java集合框架面试题常见集合集合可以看作是一种容器&#xff0c;用来存储对象信息。数组和集合的区别&#xff1a;(1)数组长度不可变化而且无法保存具有映射关系的数据&#xff1b;集合类用于保存数量不确定的数据&#xff0c;以及保存具有映射关系的数据。(2)数组元素既可以是…

面向.NET开发人员的Dapr——服务调用

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理The Dapr service invocation building b…

快速入门深度学习,其实并不难!

深度学习的概念源于人工神经网络的研究&#xff0c;而深度学习的过程就是使用多个处理层对数据进行高层抽象&#xff0c;得到多重非线性变换函数的过程。虽然深度学习的概念看似高大上&#xff0c;让人有种莫名的距离感&#xff0c;实际上它在日常生活中随处可见&#xff0c;比…

插入始终是1_插入式电磁流量计特点与应用

一、本文引言首先&#xff0c;插入式电磁流量计是电磁流量计中的一种安装类型&#xff0c;电磁流量计的安装方式有多种&#xff0c;包括法兰式安装&#xff0c;螺纹安装&#xff0c;卡箍式安装&#xff0c;插入式安装等四种类型&#xff0c;法兰式安装是常见普遍都在使用的安装…

面向.NET开发人员的Dapr——发布和订阅

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理面向.NET开发人员的Dapr——服务调用The …

bootstrap的表单验证 vue_第45天:Web表单

在了解了 Flask Bootstrap 基本框架之后&#xff0c;我们来了解一下 Flask 框架的 表单( form )&#xff0c;以帮助我们创建交互式的 Web 应用&#xff0c;最后会有个提交个人信息的例子。Flask-WTF 是 Flask 框架的一个扩展&#xff0c;用来做表单的交互&#xff0c;是对 WTFo…

超火GitHub项目!一夜获得5000星,竟是微软开源的计算器

全世界只有3.14 % 的人关注了数据与算法之美昨天&#xff0c;微软在 MIT License 下开源了一个 GitHub 项目——Windows 计算器&#xff0c;短短 24 小时内就获得了接近 5000 颗星&#xff0c;并引发大量讨论。这个项目爆红的速度可能连微软自己都始料未及。科技媒体 The Verge…

面向.NET开发人员的Dapr——目录

今天上午的主题就是Dapr&#xff0c;别错过了哦。本系列部分翻译自 .NET团队编写的Dapr for .NET Developers | Microsoft Docs(https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/)&#xff0c;大部内容复制于面向 .NET 开发人员的 Dapr | Micro…

人体工学腰垫,保腰神器,改善久坐腰酸背痛

▲数据汪特别推荐点击上图进入玩酷屋之前小木推荐“德国MINICUTE人体工学腰垫”受到了大家一致的好评和争相购买。小木为什么推荐这一款原因是&#xff1a;据统计&#xff0c;我国腰椎病患者已经突破2亿人。30~40岁人群中&#xff0c;患有颈腰椎病的占比59.1%&#xff01;而且有…

和flag_不怕立Flag,就怕没有Flag

转眼间就已经是今年的最后一天了&#xff0c;回想去年给自己立下的flag&#xff0c;看着自己手机上的减肥计划和体测成绩上的超重&#xff0c;我陷入了沉思&#xff0c;到底是哪个环节出问题了呢&#xff1f;我慢悠悠地在宿舍里转圈&#xff0c;看见舍友递过来的薯片&#xff0…

面向.NET开发人员的Dapr——状态管理

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序The Dapr state management building blockDapr 状态管理构建基块Distributed…

为什么网易云音乐总能知道你喜欢听什么歌?背后的原理竟然如此简单!

全世界只有3.14 % 的人关注了数据与算法之美无处不在的数据分析谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c…