游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3398|回复: 5

请问绘制2D图象设置透明后的黑色背景怎么改,那来的?

[复制链接]

7

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
发表于 2007-1-2 21:36:00 | 显示全部楼层 |阅读模式
需要把背景设置为透明,但剔除加载纹理关键色后却总有黑色背景框,很想知道这个是怎么产生的,该怎么修改为透明的.谢谢!曾试过修改画刷颜色,渲染时的CLEAR颜色但明显不是.

顶点格式为:
typedef struct {
  FLOAT x, y, z;     
 FLOAT rhw;
   FLOAT u, v;        
} sVertex;
#define VERTEXFVF (D3DFVF_XYZRHW |  D3DFVF_TEX1)

采用纹理贴图到POLY上,剔除了关键色(255,0,0)

D3DXCreateTextureFromFileEx(g_pD3DDevice, "draw2d.bmp",
    800, 400, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8,
    D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE, D3DX_FILTER_TRIANGLE,
    D3DCOLOR_RGBA(255,0,0,255), NULL, NULL, &g_pTexture);
  g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x01);
  g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);



sf_200712213549.jpg

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2007-1-3 16:59:00 | 显示全部楼层

Re:请问绘制2D图象设置透明后的黑色背景怎么改,那来

使用PNG格式,就不会有了。

7

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
 楼主| 发表于 2007-1-3 18:51:00 | 显示全部楼层

Re:请问绘制2D图象设置透明后的黑色背景怎么改,那来

还是有,换成TGA也一样的!

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2007-1-4 01:05:00 | 显示全部楼层

Re:请问绘制2D图象设置透明后的黑色背景怎么改,那来

再来一张图的部分是黑的,背景是白的
两张一起载入试试

6

主题

27

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2007-1-4 10:34:00 | 显示全部楼层

Re:请问绘制2D图象设置透明后的黑色背景怎么改,那来

int GetBmpWidth(const int bmWidth)
{
        int nnop = bmWidth%4;
        if (nnop)
        {
                return bmWidth + 4 - nnop;
        }
        else
        {
                return bmWidth;
        }
}

IDirect3DSurface9 * LoadSurfaceFromFile(IDirect3DDevice9 * Device, char * FileName)
{
        if (!Device) return 0;
        HBITMAP hb = (HBITMAP)LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if (!hb) return 0;
        BITMAP bmp;
        GetObject(hb, sizeof(bmp), &bmp);
        IDirect3DSurface9 * pSurface;
        if (FAILED(        Device->CreateOffscreenPlainSurface(bmp.bmWidth, bmp.bmHeight, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pSurface, NULL)
                                )
                )
        {
                DeleteObject(hb);
                return 0;
        }
        D3DLOCKED_RECT lr;
        if (FAILED(        pSurface->LockRect(&lr, NULL, D3DLOCK_DISCARD)
                                )
                )
        {
                DeleteObject(hb);
                return 0;
        }
        D3DCOLOR        *        dest        =        (D3DCOLOR*)lr.pBits;
        BYTE                *        source        =        (BYTE*)bmp.bmBits;
        int nWidth        = GetBmpWidth(bmp.bmWidth);
        for (int y=0;y<bmp.bmHeight;++y)
        {
                for (int x=0;x<bmp.bmWidth;++x)
                {
                        dest[(bmp.bmHeight - 1 - y)*(lr.Pitch/4)+x]        = D3DCOLOR_ARGB(255,
                                                                                                                                                source[(y*nWidth+x)*3+2],
                                                                                                                                                source[(y*nWidth+x)*3+1],
                                                                                                                                                source[(y*nWidth+x)*3]
                                                                                                                                                );
                }
        }
        pSurface->UnlockRect();
        DeleteObject(hb);
        return pSurface;
}

IDirect3DTexture9 * LoadTextureFromFile(IDirect3DDevice9 * Device, char * FileName)
{
        if (!Device) return 0;
        HBITMAP hb = (HBITMAP)LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if (!hb)
        {
                MessageBox(0, "LoadImage Failed!", NULL, MB_ICONSTOP);
                return 0;
        }
        BITMAP bmp;
        GetObject(hb, sizeof(bmp), &bmp);
        IDirect3DTexture9 * pTexture;
        HRESULT        hr = Device->CreateTexture(bmp.bmWidth, bmp.bmHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, NULL);
        if (FAILED(hr
        //if (FAILED(        Device->CreateTexture(bmp.bmWidth, bmp.bmHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, NULL)
        //if (FAILED(D3DXCreateTextureFromFile(Device, FileName, &pTexture)
                        )
                )
        {
                MessageBox(0, "Create Texture Failed!", NULL, MB_ICONSTOP);
                DeleteObject(hb);
                return 0;
        }
        D3DLOCKED_RECT lr;
        if (FAILED(        pTexture->LockRect(0, &lr, NULL, 0)
                                )
                )
        {
                MessageBox(0, "Lock Texture Failed!", NULL, MB_ICONSTOP);
                DeleteObject(hb);
                return 0;
        }
        D3DCOLOR        *        dest        =        (D3DCOLOR*)lr.pBits;
        BYTE                *        source        =        (BYTE*)bmp.bmBits;
        int nWidth        = GetBmpWidth(bmp.bmWidth);
        for (int y=0;y<bmp.bmHeight;++y)
        {
                for (int x=0;x<bmp.bmWidth;++x)
                {
                        dest[(bmp.bmHeight - 1 - y)*(lr.Pitch/4)+x]        = D3DCOLOR_ARGB(255*((source[(y*nWidth+x)*3+2]!=0)|(source[(y*nWidth+x)*3+1]!=0)|(source[(y*nWidth+x)*3]!=0)),
                                                                                                                                                source[(y*nWidth+x)*3+2],
                                                                                                                                                source[(y*nWidth+x)*3+1],
                                                                                                                                                source[(y*nWidth+x)*3]
                                                                                                                                                );
                }
        }
        pTexture->UnlockRect(0);
        DeleteObject(hb);
        return pTexture;
}

7

主题

35

帖子

35

积分

注册会员

Rank: 2

积分
35
 楼主| 发表于 2007-1-4 17:38:00 | 显示全部楼层

Re: 请问绘制2D图象设置透明后的黑色背景怎么改,那来

呵呵!明白了,下面是我的推理过程,欢迎大家指正
  是因为我没开启ALPHA测试.D3DXCreateTextureFromFileEx()函数只完成了关键色D3DFMT_A8R8G8B8的透明化,而剩下的象素丢弃工作则由ALPHA测试来完成.
  所见到的黑色应该是多边形填充模式D3DFILL_SOLID或者D3DFILL_FORCE_DWORD的默认填充颜色(尝试用D3DFILL_WIREFRAME 的话能完全看到背景色).
  不过一句题外话默认填充颜色是怎么该的哦? [em16]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 04:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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