游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3400|回复: 9

再问透明贴图的问题!高手帮忙!

[复制链接]

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2004-8-3 23:03:00 | 显示全部楼层 |阅读模式
我们都知道用遮罩图来透明化背景。但是每张图片都要遮罩图不是很痛苦么?我有个实例,通过创建一个单色MEMORY DC、设置一个透明色来实现透明背景的,但是那个实例中的函数调用很繁杂,没有搞懂,望高手解释一下!
帮忙帮忙! [em24]

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2004-8-4 11:15:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

我知道你说的什么,不过建议还是用掩模图制作.
因为他即时判断图像上各点的颜色并进行替换VB很慢的

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-8-4 19:47:00 | 显示全部楼层

Re: Re:再问透明贴图的问题!高手帮忙!

yinxiaodan: Re:再问透明贴图的问题!高手帮忙!

我知道你说的什么,不过建议还是用掩模图制作.
因为他即时判断图像上各点的颜色并进行替换VB很慢的



那个例子不是用“各个”点判断的啊,那个例子里面制作了图形的单色DC,然后用了三次BITBLT,透明图就完成了。 [em7]

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-8-6 19:13:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

难道高手都写程序去了?这个问题不应该是很难的啊!
看来还是自己研究得了……

73

主题

612

帖子

618

积分

高级会员

Rank: 4

积分
618
发表于 2004-8-6 19:22:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

为什么你不把代码发出来让大家看看,而在这空谈呢?

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-8-6 19:39:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

说实话,那个实例实在太大,如果我知道哪些需要参考,就搞懂了。

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2004-8-6 19:42:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

发现一个更加好的例子,研究去了……研究好跟大家分享

3

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2004-8-12 09:44:00 | 显示全部楼层

Re:再问透明贴图的问题!高手帮忙!

很简单.采用带有Alpha通道的TGA格式的图片文件,就可以了.渲染的时候使用下列程序:
  g_D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  g_D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
  g_D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1  'TRUE  
可以参见《Direct3D原理与API参考(下)》 P249

1

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2004-8-12 12:56:00 | 显示全部楼层

Re: 再问透明贴图的问题!高手帮忙!

用GDI来实现的话,有几种方法:
1 。 就是用单独的遮罩图。
2。最简单的方法是 用TransparentBlt函数 , 这个函数定义在msimg32.dll中,不过可惜vb自带的api viewer中没有,这需要自己写declare , 如下:
Public Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal HeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long
用法和bitblt相似,最后的crTransparent就是透明色.

3. 比较麻烦一点的,就是用几个Bitblt产生透明效果。参考一下我写的程序:
    maskDC = CreateCompatibleDC(0)   '1.建立单色mask DC
    maskBitmap = CreateBitmap(S_Width, S_Height, 1, 1, 0)
    SelectObject maskDC, maskBitmap
   
    SetBkColor foreDC, TransColor '2.把前景图的背景色设为透明色
    BitBlt maskDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCCOPY '3.copy前景图到单色DC得到mask

    SetBkColor foreDC, RGB(0, 0, 0)   '4.把前景图与mask图作与运算
    SetTextColor foreDC, RGB(255, 255, 255)
    BitBlt foreDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
   
    SetBkColor backDC, RGB(255, 255, 255)   '5.把背景图与mask图作与运算
    SetTextColor backDC, RGB(0, 0, 0)
    BitBlt backDC, 0, 0, S_Width, S_Height, maskDC, 0, 0, SRCAND
   
    '6.把前景图和背景图作或运算
    BitBlt backDC, 0, 0, S_Width, S_Height, foreDC, 0, 0, SRCPAINT
   
    BitBlt T_DC, T_X, T_Y, S_Width, S_Height, backDC, 0, 0, SRCCOPY
这是截取的一段,如果看不懂,我把类文件放上,自己研究吧。
[em9]

sf_200481212567.rar

3.03 KB, 下载次数:

1

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2004-8-12 13:06:00 | 显示全部楼层

Re: 再问透明贴图的问题!高手帮忙!

顺便说一下:
我发的程序里 的 AlphaBlendBitblt 函数 就是调用AlphaBlendBlt 函数来实现Alpha混合,透明程度可调的,用GDI实现的哦.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-16 13:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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