游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4033|回复: 10

奇特的Alpha通道值

[复制链接]

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2011-3-24 10:36:00 | 显示全部楼层 |阅读模式
我在做一张地图,并且想以该图的alpha通道值来标记不同的区域。但是遇到了一个很奇怪的问题。

1.我在PS里边建了一张32bit(8bit/alpha)的图,并在该图的alpha通道上对应的区域设置好自己指定的alpha值,然后将图保存为map.tga。(在设置区域alpha值的时候羽化值是0,所以不存在边缘的过渡色问题)

2.在D3D中D3DXCreateTextureFromFile()打开,获取0层表面,依次读取并检查每个像素的alpha值,发现在PS里设置的值除0和255之外,其他几个值都变了。

3.用逆向的方法试了一下。现在D3D中打开map.tga,然后获取0层表面,依次修改每个像素的alpha值,然后再保存该Texture为modified.tga。在PS中打开modified.tga,用吸管工具单独读取alpha通道的值也出现了同样的问题,除0和255之外,其他的值都发生了改变,和步骤3中得到的结果刚好是相反的。

4.于是我在D3D中将alpha的值从0到255分别测试了一下,并保存到对应的Modified(alpha).tga中,在PS里打开并读取alpha通道值,对应关系如下(只列出了其中一部分):
D3D中设置的值     PS中读取的值
     0                 0
     1                 1
     2                 2
     3                 4
     4                 6
     5                 9
     6                 11
     7                 14
     8                 16
     9                 19
     10                21
     11                23
     12                25
     13                27
     14                29
     15                31
     16                33
     17                35
     18                36
     19                38
     20                40
     21                42
     ...
     50                82
     ...
     75                110
     ...
     100               135
     ...
     125               158
     ...
     255               255

5.通过D3D修改的alpha值并保存Texture,再用D3D程序打开该Texture,得到的alpha通道值和先前指定修改的值是一样的。同样PS也是一样的结果。

问题: 为什么用D3D修改Texture的通道信息在PS里会读取出不同的结果,是因为tga存在什么独有的压缩算法吗?如果说tga存在独有的压缩算法的话,那为什么我用BMP格式来测试的时候也会出现上面的结果呢?

蛋疼了,如果用PS都不能精确控制图像中各个像素的分量值,那么我们想精确控制图像的像素的时候,还能借助像PS这样的绘图辅助工具吗?

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2011-3-24 10:48:00 | 显示全部楼层

Re:奇特的Alpha通道值

DX是可以识别PNG中的透明通道的.
打开RenderState中的透明参数,渲染的时候自动就透明了.

这个不用研究.

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2011-3-24 10:53:00 | 显示全部楼层

Re:奇特的Alpha通道值

我知道怎么利用alpha通道的值来做半透明效果。但是现在我并不是要做半透明效果,而是要利用alpha值(0-255)来做标记,或者说是索引值吧。所以需要得到精确的alpha值。

33

主题

159

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
QQ
发表于 2011-3-24 10:56:00 | 显示全部楼层

Re:奇特的Alpha通道值

如果使用AlphaTest的话,把AlphaRef的值调高一点就可以把白边去掉,
原因是什么仅个人意见)
在PhotoShop里面做的图是有图层的,底层全是alpha = 0,上层是色彩图,两层间是不搞的,然而转成tga后,图层不存在了,这时候 上层色彩图边界处(主要是边界处的alpha值不并不是饱合的)会自动与底层alpha值mix,出来的效果就是透明的边际有白边.
这就要你在pixelShader里处理了,如果alphatest,把alphafunc=7 然后给alphaRef的值定的高一点
如果你实在舍不得混合效果,冒死用alphaBlend ,在pixelShader里定义一个float Ref = 0.1(或更高)
然后 float alpha= tex2D(samplerX,UV).a - Ref;也可以把白边去掉
讲的不是很有条理,不过应该就是这样滴了

这几天刚刚在搞AlphaShadow,现学现用了

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2011-3-24 11:06:00 | 显示全部楼层

Re: Re:奇特的Alpha通道值

dana9919: Re:奇特的Alpha通道值

如果使用AlphaTest的话,把AlphaRef的值调高一点就可以把白边去掉,
原因是什么仅个人意见)
在PhotoShop里...

你所讲到的是怎样去除白边,也是渲染方面的问题。如果是做UI的话,完全可以通过调整UV坐标0.5个像素单位来解决。

但我发帖是想解决,怎样在PS中按指定的值修改ALPHA通道,并且在D3D中准确读取出这些ALPHA值来。
你所提到的PS中因为图层的关系出现边缘MIXING的问题,我想我没有遇到。因为我在PS保存的图当中,我的边缘部分都采用了0作为alpha值,用D3D读取之后检查边缘部分(行和列分别对应两个极值的时候)alpha也都是0。

33

主题

159

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
QQ
发表于 2011-3-25 09:09:00 | 显示全部楼层

Re:奇特的Alpha通道值

UI是什么?

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2011-3-25 09:28:00 | 显示全部楼层

Re: Re:奇特的Alpha通道值

dana9919: Re:奇特的Alpha通道值

UI是什么?

User Interface

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2011-3-25 09:34:00 | 显示全部楼层

Re:奇特的Alpha通道值

昨天又试了一下,同一张图,在PS CS4和CS5中打开之后,读取ALPHA通道的值会有不同的结果。
咨询了一下,说可能与PS里设置的颜色管理方案和WINDOWS桌面设置的颜色管理方案有关。因为
我对颜色管理方案一窍不通,所以又不能排除这个原因。希望有知道的前辈能告知一二,谢谢

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
 楼主| 发表于 2011-3-25 10:09:00 | 显示全部楼层

Re: 奇特的Alpha通道值

早上试了一下在同一个版本的PS中修改颜色管理方案,确实会对alpha通道的值造成影响。但即使是
选择对该图像不使用任何色彩管理方案,在D3D中读取出来的alpha值,还是和在PS中设置的值不一样!
!!!!! [em17]

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2011-3-25 12:06:00 | 显示全部楼层

Re:奇特的Alpha通道值

是不是开压缩贴图格式了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-7 05:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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