游戏开发论坛

 找回密码
 立即注册
搜索
楼主: kingmark

初学D3D,请教纹理间的缝隙问题[配图]

[复制链接]

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-11-16 15:02:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

确实是过滤算法和GPU光栅化的问题,这点毫无疑问。只有point sampling才能做到纹理采样边界的完全不走样(也就是说不论linear还是anisotropic都会造成边界走样)。不过一般来说只要不开msaa的话这种走样一般不会注意到。开了msaa后这种现象会比较明显。这时需要通过centroid sample来修正。

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2004-11-16 15:50:00 | 显示全部楼层

Re: 初学D3D,请教纹理间的缝隙问题[配图]

我是推崇用这招: [em20]
D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);

下面那个会使离子变粗(不宜采用): [em21]
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2004-11-17 11:49:00 | 显示全部楼层

Re: Re:初学D3D,请教纹理间的缝隙问题[配图]

lly20000: Re:初学D3D,请教纹理间的缝隙问题[配图]

不对 不对 大家说的都不对 我的demo里面 曾经也有这个问题 没有大家说的那么复杂 主要是的2d贴图 上面的alpha的通道没有将以前没有透明的部分擦干净 在photoshop里面改改吧


tga贴图在附件中,帮我看看什么地方没有擦干净。我看了很久,没有觉得不干净阿。

sf_20041117114910.zip

205.95 KB, 下载次数:

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-11-17 14:34:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

哎,说了是过滤算法的问题,linear必然要四点取样插值,所以纹理边界处必然有误差。Jeminai
老兄说的是一种解决方法。就是使用texture coordinate clamp

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-11-17 15:19:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

整理了一下思路,解释一下原因:拿一个1D texture来比喻。设其为256x1大小。则linear会取两个texel进行采样。
1:纹理坐标映射规定,针对上面的纹理,0.0映射到纹理空间的-0.5,而1.0映射到255.5。
所以如果纹理使用warp,则1.0处要采样texture中第1个texel和最后一个texel,然后以权重0.5进行混合。那么显然混合出来的颜色不是想要的颜色,也就是会出现边界处的失真。
证据:如果你把1.0改为511/512的话这种现象就会消失。同样,纹理坐标0.0处也会失真,你改为1/512的话这种失真就会消失。
2:使用clamp的话则1.0处需要采样的texel为两个第256个texel,所以不会出现失真。
这就是linear的边界失真,也就是说,如果你想让一个quad贴上一张纹理的话且该纹理的纹理寻址使用warp的话,四角的纹理坐标不要定为(0.0,0.0),(1.0,0.0),(0.0,1.0),(1.0,1.0),而应该分别是(0.5/texture width,0.5/texture height),(0.5/texture width,1-0.5/texture height),(1-0.5/texture width,0.5/texture height),(1-0.5/texture width,1-0.5/texture height)
至于msaa产生的纹理边界失真,和这个从原理上有区别,那是由于subpixel中心与msaa下该subpixel所属pixel的纹理采样中心之间的偏移造成的。

35

主题

340

帖子

350

积分

中级会员

Rank: 3Rank: 3

积分
350
发表于 2004-11-17 17:01:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

编程序 时候 碰到已经不足为怪了
倒的是有一次用3d max5做天空盒,这道亲爱的缝竟然出现,而且消不掉,各种设置都试过了

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2004-11-17 17:36:00 | 显示全部楼层

Re: Re:初学D3D,请教纹理间的缝隙问题[配图]

hourousha: Re:初学D3D,请教纹理间的缝隙问题[配图]

整理了一下思路,解释一下原因:拿一个1D texture来比喻。设其为256x1大小。则linear会取两个texel进行采样...


感谢感谢!受用非浅!!!

0

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2004-11-18 17:58:00 | 显示全部楼层

Re: 初学D3D,请教纹理间的缝隙问题[配图]

路过看见这个贴子~~


这种问题可能性很多的说~~

我再说一个会出现这种现象的可能

const D3DCAPS9      *pCaps;
pCaps= (const D3DCAPS9 *)RwD3D9GetCaps();
if ( ((pCaps->TextureCaps & D3DPTEXTURECAPS_POW2) != 0) &&
     ((pCaps->TextureCaps &       D3DPTEXTURECAPS_NONPOW2CONDITIONAL) == 0))

如上两个显卡性能参数~~

在贴图时,不同的县卡在对非pow2的数据和pow2的数据处理出现的效果也是不同的

0

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2004-11-18 18:02:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

hourousha所说的偏移量0.5个像素

在不同的显卡,也有所不同~~

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-11-18 19:48:00 | 显示全部楼层

Re:初学D3D,请教纹理间的缝隙问题[配图]

楼上说的不错,确实不同硬件偏移会有不同,拿ATI来说,是否打开‘Alternate Pixel Center’选项也会影响该偏移。
不过对于多数硬件,这个偏移是成立的,而且D3D标准中对纹理地址映射也是使用该公式。
至于非2的整数幂大小纹理的情况,由于以前没有用过,所以不好下结论。有工夫我试一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-19 07:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表