今天考虑程序的优化问题,突然想到说现在vetex shader已经可以访问纹理资源了,可以把访问高度图的操作转移
到vetex shader中去做计算,GPU访问纹理的速度要比CPU访问内存快多了吧(我是这么认为的)。不过遇见一个问题。
用tex2D访问出来的值怪怪的,不是我要的高度纹理值,后来发现如果fragment shader里面访问了别的纹理会影响到vetex里
面的,上网google了一下,好多人都说得用 tex2DLod才行,试了下一点好转的迹象都没有,又有人说纹理得是float的,参照
着改了下,还是不行。(很多时候在网上查到的都不好用,当然也有好用的,有点废话,哈哈)
后来突然发现我的sampler都没有跟寄存器绑定,绑定了以后就好了,很奇怪,难道说只调用cgGLSetTextureParameter
并不能实现纹理的绑定? 现在我把所有sampler都跟一个寄存器绑定后就一切正常了。
就像这样:
//--------------------------------------------------------------------------------
sampler2D t10 :TEXUNIT0;//地面高度图, 其他的sampler也需要绑定到寄存器才会好用
OutPut xS_v(float4 ipos:POSITION,
float2 tex:TEXCOORD0,
float3 normal:NORMAL)
{
OutPut OUT; //out是关键字
ipos.y =tex2D(t10,tex).z*256;
//---------------------------------------------------------------------------------
cg语言运行出来的结果经常怪怪的,有一次我故意写错了一句话,结果编译也能通过,只是显示出来的完全不
是我想要的,有没有高人指点一下,多谢!!
不过把访问高度图改到用GPU访问纹理后,效果还是很明显的,速度提升了差不多一倍。