« 水效果Ⅱ - 涟漪学一学,VBO »

Vertex Texture Fetch 顶点纹理拾取

2009-8-19 22:50:32 | 发布:zwqxin

Vertex Texture Fetch,简称VTF,是Shader Model的一个特性。其本质没有什么复杂的:就是在顶点Shader里检索纹理。——ZwqXin.com

[Shader快速复习:Per Pixel Lighting(逐像素光照)] 
[Shader快速复习:Cube Mapping(立方环境贴图)] 
[Shader快速复习:Reflection And Refraction(反射与折射)]

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/shaderglsl/glsl-vertex-texture-fetch.html

是的,在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顶点纹理拾取的存在就不言自明了:其实不是在拾取含有图像像素信息的那个纹理,而是在拾取含有顶点数据信息的那个“数组”啊!在这里,数组的索引就是顶点纹理坐标……看例子:

  1. //RenderMonkey:
  2. //Vertex Program
  3. varying vec4 vertColor;
  4. uniform sampler2D baseMap;
  5. void main( void )
  6. {
  7. //vertColor = texture2D(baseMap, gl_MultiTexCoord0.xy);  与下句等价
  8. vertColor = texture2DLod(baseMap, gl_MultiTexCoord0.xy, 0.0);
  9. vec4 pos = gl_ModelViewMatrix * (gl_Vertex) ;
  10. gl_Position = gl_ProjectionMatrix * pos ;
  11. }
  12. //Fragment Program
  13. varying vec4 vertColor;
  14. void main( void )
  15. {
  16. gl_FragColor = vertColor;
  17. }

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


(对比用。这是FTF,传统的fragment shader获取纹理)

(这是VTF,顶点纹理拾取,也就是上面代码的产物,对比两图哈)

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

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

  1. //RenderMonkey:
  2. //Vertex Program
  3. varying vec4 vertColor;
  4. uniform sampler2D baseMap;
  5. void main( void )
  6. {
  7. vertColor = texture2DLod(baseMap, gl_MultiTexCoord0.xy, 0.0);
  8. vec4 offset = vec4(0.0);
  9. if(gl_Vertex.z > 0.0)
  10. offset = vertColor;
  11. else if(gl_Vertex.z < 0.0)
  12. offset = vec4(1.0)-vertColor;
  13. vec4 pos = gl_ModelViewMatrix * (gl_Vertex+ offset) ;
  14. gl_Position = gl_ProjectionMatrix * pos ;
  15. }
  16. //Fragment Program
  17. varying vec4 vertColor;
  18. void main( void )
  19. {
  20. gl_FragColor = vertColor;
  21. }

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

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

  1. //RenderMonkey:
  2. //Vertex Program
  3. varying vec2  texCoord;
  4. uniform sampler2D Texture0;
  5. void main(void)
  6. {
  7. vec4 vcol =  texture2D( Texture0, gl_MultiTexCoord0.xy);
  8. float gray = 0.2990*vcol.r + 0.5870*vcol.g + 0.1140*vcol.b;
  9. vec4 pos =  gl_Vertex;
  10. pos.z = pos.z * (1.0 - 5.0*gray);
  11. gl_Position = gl_ModelViewProjectionMatrix * pos;
  12. texCoord = gl_MultiTexCoord0.xy;
  13. }
  14. //Fragment Program
  15. uniform sampler2D Texture0;
  16. varying vec2 texCoord;
  17. void main(void)
  18. {
  19. gl_FragColor = texture2D( Texture0, texCoord );
  20. }

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

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

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/shaderglsl/glsl-vertex-texture-fetch.html

Vertex Texture Fetch 顶点纹理拾取相关推荐

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

    在vertex shader里也可以检索纹理.我本来觉得这没什么好奇怪的,因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture ...

  2. 柏林噪声实践 水与火,顶点纹理拾取

    在上文中,会发现,调用3维柏林实现海水的波动效果,实在是难为CPU了,在这里,我们用着色器Cg语言来把相关计算过程移到GPU,看下效果. 先说下,原来纹理我们拿来只限于给模型着色,而在现代GPGPU中 ...

  3. Vertex and FragmentShader顶点与片段着色器

    一.顶点与片段着色器简介 Vertex and FragmentShader:最强大的Shader类型,也是本系列的重点,下文中简称V&FShader,属于可编程渲染管线.使用的是CG/HLS ...

  4. OpenGL Texture Coordinate Wrapping纹理坐标包装的实例

    OpenGL Texture Coordinate Wrapping纹理坐标包装 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <verm ...

  5. 基于顶点纹理的无限大海水仿真

    最近手上有了一块7800的显卡,因此就想利用这块强大的显卡做点东西出来.基于顶点纹理的无限大面积海水的算法在脑子想了很久了,但一直苦于没有支持顶点纹理的显卡而无法实现.        拿到显卡以后,就 ...

  6. 【转】The XOR Texture 异或纹理(Lode's Computer Graphics Tutorial)

    The XOR Texture 异或纹理 说明 最近在做纹理合成和传输的相关研究.本文是我在淘纹理合成相关材料时偶然得到,觉得这个纹理合成过程挺有意思,做了一些简单的翻译.因为是本人的第一篇随笔,所以 ...

  7. unity texture贴图纹理

    文章内一些内容引用自作者:Aimar_Johnny http://blog.csdn.net/lzhq1982/article/details/75045358 导入png图片,默认显示如下 Text ...

  8. qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式

    参考文章: 使用采样器状态 - Unity 手册​docs.unity3d.comhttps://blog.csdn.net/chenjinxian_3D/article/details/518169 ...

  9. OpenGL Texture Wrap Modes纹理包裹模式的实例

    OpenGL wrapmodes纹理包裹模式 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <sb7.h> #include < ...

最新文章

  1. cmd文件内容添加到文件内容命令
  2. c语言220程序,《C语言程序实例大全》原代码220例
  3. 每日一笑 | 为什么椅子总是最乱的?
  4. mysql 和区块链的差别_论区块链是什么数据库——正名篇
  5. 方格取数(1)(HDU-1565)
  6. 手写SpringIOC注解版本
  7. FPGA学习小例子:38译码器设计与仿真
  8. java做报表_推荐6款常用的Java开源报表制作工具
  9. 数值分析--python--LU分解法
  10. [TJOI2019]唱、跳、rap和篮球
  11. 深圳再添新高校!“深圳海洋大学”,正式获批!
  12. AP 计算机 真知源自实践,盛誉源自读者;孜孜不倦,止于至善---林振营老师编著的中国第一套 AP计算机教材学生评价
  13. 实时系统vxWorks - 配置多网口
  14. css中cale()函数的使用
  15. 2345浏览器兼容性设置在哪里
  16. L1-040 最佳情侣身高差(Python3)
  17. 3-2存储系统-主存与CPU的连接外部存储器
  18. 麦克尼马尔检验(McNemar test)
  19. 如何将excel表格导入word_word办公技巧:如何让Excel与Word文档数据同步
  20. 香港十大外汇交易商排名名单2020最新版

热门文章

  1. 筛选列_Excel办公实操,两大办公技能,复杂数据进行筛选,一看就会
  2. python找不到模块pyodbc_“import pyodbc”导致“没有名为pyodbc的模块”
  3. python函数控制词典_Python 基础之集合相关操作与函数和字典相关函数
  4. 华为p20Android怎么解开,华为P20如何获得root权限来解决自启动手机应用程序的问题...
  5. Python刷题-2
  6. html5 火焰效果图,css3火焰文字特效
  7. php持久对象,php-在理论中具有两个外来身份的持久对象
  8. 关于c语言的基本知识,第二章_关于C语言的基本知识.ppt
  9. android 键盘遮盖输入框_android弹出输入框,软键盘挡住部分编辑框
  10. ROS学习笔记02:ROS架构与基础