小星星的天空

O(∩_∩)O 小月亮的fans ^_^

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  16 随笔 :: 0 文章 :: 61 评论 :: 0 Trackbacks


         今天考虑程序的优化问题,突然想到说现在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访问纹理后,效果还是很明显的,速度提升了差不多一倍。




posted on 2009-10-13 09:02 Little Star 阅读(2430) 评论(4)  编辑 收藏 引用 所属分类: Computer Graphics

评论

# re: vertex shader texture 访问纹理的方法 2009-10-13 10:05 小熙
你好,请教一个问题,在绘制三角形的时候是怎样利用 ipos.y值的,Cpu程序要做相应的关联吗?谢谢  回复  更多评论
  

# re: vertex shader texture 访问纹理的方法 2009-10-13 15:43 littlestar
@小熙
本来我的三角形得Y值是在cpu中读取得高度图中的值,高度图存在一个二维数组中。现在是根据传进vertex里的x,z值计算出来的纹理坐标uv访问得纹理,(把高度图设置成纹理)(实际上也可以cpu直接给出三角形各个点的对应高度图纹理坐标,然后在vetex里面得到高度)不知道说明白没,呵呵  回复  更多评论
  

# re: vertex shader texture 访问纹理的方法 2009-10-13 17:12 李熙建
@littlestar
纹理坐标uv是编译器自动从纹理的(0,0)~(x,z)的吧,貌似x,z不用从CUP传到GPU(不知道理解正确不?),我的问题是,GPU得到了ipos.y之后还要不要给vetex的y赋值呢,ipos.y到vetex.y是自动关联的吗?谢谢  回复  更多评论
  

# re: vertex shader texture 访问纹理的方法 2009-10-13 22:31 Little Star
@李熙建
你说的也可以,两种方法都行,依你的需要而定。总之最终你需要获得一个纹理的uv值来访问纹理,得到高度后怎么用那也视个人需求而定,我是用它来得到高度后进行mvp变换,输出顶点位置。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理