做公司网站哪家好 上海,百度域名排行,自己电脑做网站还用备案,怎么制作网站app在vertex shader里也可以检索纹理。我本来觉得这没什么好奇怪的#xff0c;因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture2D这类函数不是fragment shader专用的#xff0c;倒还有texture2DLod这种在vertex shader里专用的#xf…在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] GPGPUGeneral 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”的效果是一样的 对比用。这是FTF传统的fragment shader获取纹理这是VTF顶点纹理拾取也就是上面代码的产物对比两图哈 纹理只是普通的纹理。只是为了证明VTF能行- -。把顶点纹理的值做插值预料最后的结果类似于顶点颜色插值三角片元的颜色在三角的三顶点所获得的纹理颜色间进行线性插值得出如此“重过渡味模糊”的怪象嘛~这纹理即使是那FTF出来的也是怪象。然后测试texture2DLod这个函数把最后的LOD参数增大调为0.4 lod是细节参数这跟以前的FTFPTF差不多。好吧换张纹理后再用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果然充满力量 另外一个例子则用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最典型的应用啊 在Vertex Shader里面通过纹理坐标的检取VTF获取的是真正的“高度值”数据……只是这些数据被储存在一张纹理上罢了。