游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2763|回复: 2

D3DTOP_MODULATE 有误差问题吗?

[复制链接]

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2006-7-9 08:42:00 | 显示全部楼层 |阅读模式
lpDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
lpDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
lpDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);

我把一个纹理A绑定到一个正方形X上面,这个正方形的4个顶点的颜色值是RGBA(0.98,0.98,0.98,1),然后把这个正方形X渲染到另外的一个纹理B上面(SetRenderTarget),在下一桢我又把纹理B绑定到这个正方形X上面,再把这个正方形渲染回纹理A,如此反复。

我想问的是,如果我的纹理A一开始有颜色的话,那我每次渲染它的每个象素的RGB值都应该乘以0.98对吧?这样下去很快渲染出的纹理的RGB值都应该到0。我是这么想的,但结果是最后的纹理颜色稳定在一种比黑色稍微亮一点的灰色上。如果我把顶点的颜色改成(0.9,0.9,0.9,1),那这个问题会有点好转,但结果还是不是黑色。

是D3D的颜色操作有误差?我的纹理格式都是D3DFMT_A8R8G8B8,精度应该够吧?还是什么别的问题? [em4]

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-7-9 15:05:00 | 显示全部楼层

Re:D3DTOP_MODULATE 有误差问题吗?

这是精度问题,D3DFMT_A8R8G8B8说明每个通道只有2^8=256个级别,在显卡内并不是浮点数,所以这样渲染结果会趋向于一个常数(不一定是0).
如果开始的纹理颜色较亮(大于右边的值),最后颜色应该在( 25/255, 25/255, 25/255, 1 ),因为25X0.98 = 24.5约=25,小于这个值颜色就应该不变了.同理X0.9会趋向 5/255.
这样可以推出,要最后得到黑色,那么应该乘以一个小于0.5的值.

你可以这样验证一下,用白色纹理,把纹理采样改为POINT,然后顶点色( 0.98, 0.98,0.98,1 ),
BLEND,FOG,SPECULAR,DITHER等关掉.等颜色稳定,用D3DXSAVESURFACETOFILE存下RT,再用PS打开PICK颜色看看,理论上RGB应该都等于25的.

我也没具体试过,但理论推导上是这样的.你试试吧.

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2006-7-9 15:51:00 | 显示全部楼层

Re:D3DTOP_MODULATE 有误差问题吗?

谢谢:)我去试试看:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 21:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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