请教D3D着色器,hlsl的tex2Dlod取值问题

wtf_ohmygod 2015-01-30 10:21:59
我将float数据存成图片,数据范围较大。
比如:-200.02 ,-20.876 ,-1.0987 ,2.874 ,100.55 ,1240.2345 等等。。
用tex2Dlod取出来就成了1.0和0.0等数据
是不是tex2Dlod只能取0~1.0范围的值?

我将数据加倍增或者倍减后
比如 -200 ,-20 , 10 ,100
变为 1/1 , 1/181 , 1/211 , 1/301
就能正确取出下面的数据
问题在于数据凌乱后,这样改变数据再还原误差很大。
请问有没有办法将图片里的数据取出来,直接和原数据一样?
...全文
979 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beautyangus 2015-02-06
  • 打赏
  • 举报
回复
还有一点,考虑到是纯数据,不要进行 LOD,同时也要将 sampler 设置为 Point,而不是 Linear,希望能帮到你。
wtf_ohmygod 2015-02-06
  • 打赏
  • 举报
回复
引用 8 楼 beautyangus 的回复:
还有一点,考虑到是纯数据,不要进行 LOD,同时也要将 sampler 设置为 Point,而不是 Linear,希望能帮到你。
因为程序中有循环和分支 在循环和分支里面无法使用tex2D 所以就用tex2Dlod了 我的sampler设定是Point 我也是多次尝试无果,能用的都搜遍了,还没找到解决办法才来问的。 非常感谢你的帮助。
wtf_ohmygod 2015-02-04
  • 打赏
  • 举报
回复
引用 5 楼 beautyangus 的回复:
[quote=引用 4 楼 wwccwwccwwcc 的回复:] [quote=引用 3 楼 beautyangus 的回复:] tex 系列函数得到的返回值是 a32fr32fg32fb32f 的 value,看起来楼主的原始纹理格式应该是 r32f 格式才对,所以,需要创建正确的纹理格式先,就是使用 DXGI_FORMAT_R32_FLOAT 来创建纹理,得到的 value 里的 arg 通道都将是 0.0f。
我创建的纹理是D3DFMT_A32B32G32R32F,每一个通道32f都存放一个float数据。[/quote] 这样就比较麻烦,对于正常的纹理来说,argb 每个分量都是在 0.0f~1.0f 的,所以,目前的 shader 并没有支持这种格式,分量都是会被 saturate 的。 从楼主的需求来看,你的贴图根本不是用来做“贴图”的吧,应该只是某种数据缓存或者 DepthMap,首先考虑的应该是优化逻辑,适应 0.0f~1.0f 的数据。如果不愿意这样,只能用 Stream 了。[/quote] 是的,不是贴图,是一个存了矩阵的多叉树,因为数据较多,所以用tex2Dlod来读取,然而数据被我通过一套规则适应到0.0f~1.0f后取单个值的pixwin调试可以看到数据大致是对的(精度不对)。但是一次性把rgba4个位置的值取出来,调试就进不去那个函数,看不到结果。 因为调试被跳过了,看不到结果,到现在还搞不清楚问题出在哪。 我猜测: 1.数据被适应到0.f~1.f后,精度出问题,计算不正确。 2.循环和分支支持问题,程序的执行流程并不和我的预期一样。 3.其他我没想到的问题。
beautyangus 2015-02-03
  • 打赏
  • 举报
回复
引用 4 楼 wwccwwccwwcc 的回复:
[quote=引用 3 楼 beautyangus 的回复:] tex 系列函数得到的返回值是 a32fr32fg32fb32f 的 value,看起来楼主的原始纹理格式应该是 r32f 格式才对,所以,需要创建正确的纹理格式先,就是使用 DXGI_FORMAT_R32_FLOAT 来创建纹理,得到的 value 里的 arg 通道都将是 0.0f。
我创建的纹理是D3DFMT_A32B32G32R32F,每一个通道32f都存放一个float数据。[/quote] 这样就比较麻烦,对于正常的纹理来说,argb 每个分量都是在 0.0f~1.0f 的,所以,目前的 shader 并没有支持这种格式,分量都是会被 saturate 的。 从楼主的需求来看,你的贴图根本不是用来做“贴图”的吧,应该只是某种数据缓存或者 DepthMap,首先考虑的应该是优化逻辑,适应 0.0f~1.0f 的数据。如果不愿意这样,只能用 Stream 了。
wtf_ohmygod 2015-02-03
  • 打赏
  • 举报
回复
引用 3 楼 beautyangus 的回复:
tex 系列函数得到的返回值是 a32fr32fg32fb32f 的 value,看起来楼主的原始纹理格式应该是 r32f 格式才对,所以,需要创建正确的纹理格式先,就是使用 DXGI_FORMAT_R32_FLOAT 来创建纹理,得到的 value 里的 arg 通道都将是 0.0f。
我创建的纹理是D3DFMT_A32B32G32R32F,每一个通道32f都存放一个float数据。
beautyangus 2015-02-02
  • 打赏
  • 举报
回复
tex 系列函数得到的返回值是 a32fr32fg32fb32f 的 value,看起来楼主的原始纹理格式应该是 r32f 格式才对,所以,需要创建正确的纹理格式先,就是使用 DXGI_FORMAT_R32_FLOAT 来创建纹理,得到的 value 里的 arg 通道都将是 0.0f。
渃水 2015-01-30
  • 打赏
  • 举报
回复
楼主竟然邀请我,好激动, 我只能说 不懂帮顶
wtf_ohmygod 2015-01-30
  • 打赏
  • 举报
回复
引用 1 楼 yuyang00000 的回复:
楼主竟然邀请我,好激动, 我只能说 不懂帮顶
...感觉没人来啊。。。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧