激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢(xún)電話(huà):400-810-1418 服務(wù)與監(jiān)督電話(huà):400-810-1418轉(zhuǎn)接2

制作游戲畫(huà)面的透明特效技巧

發(fā)布時(shí)間:2023-12-11 17:50:47 瀏覽量:263次

有時(shí)候,我們需要在畫(huà)面上顯示一張角色的圖像,而這張圖片是有自己的背景的,要是直接貼到了游戲的畫(huà)面中,就會(huì)出項(xiàng)覆蓋游戲畫(huà)面。顯示出的效果特別不好,這里我們可以用到透明效果來(lái)處理。

其中,原理就是用BitBlt() 的Raster值運(yùn)算去掉原圖片的背影。但是只適用于原圖背景為黑色,才會(huì)看到效果。


如圖,左邊部分為前景圖,右邊部分為屏蔽圖

以下為顯示的背景圖

為了得到透明效果,我們需要運(yùn)用到BitBlt()貼圖函數(shù)以及其參數(shù)Raster的值來(lái)將圖片中不必要的部分去掉(又稱(chēng)去背),使得圖中的主題可以與背景完美融合。


制作透明效果有很多種方法,但是基本上都是利用貼圖時(shí)不同的Raster運(yùn)算,通過(guò)轉(zhuǎn)換而產(chǎn)生相同的透明效果。在這里先來(lái)介紹一種透明運(yùn)算的方法。

我們以圖中的恐龍為例子,首先準(zhǔn)備一張位圖,如下圖。

圖中的左邊的圖是要去背并貼到背景上的前景圖。右邊的黑白圖稱(chēng)為“屏蔽圖”,在透明的過(guò)程中會(huì)用到它。要把去背的位圖與屏蔽圖合并成同一張圖,透明的時(shí)候再按照需要來(lái)進(jìn)行裁切。可以把它分成兩張圖,但是這樣程序必須運(yùn)行兩次圖文件加載的操作。


有了屏蔽圖就可以利用貼圖函數(shù)來(lái)產(chǎn)生透明效果了,所需的貼圖步驟如下:

<1>將屏蔽圖與背景圖做"AND"運(yùn)算,Raster值為SRCAND,貼到目的地DC中。

<2>將前景圖與背景圖做"OR"運(yùn)算,Raster值為SRCPAINT,貼到目的地DC中。

為什么經(jīng)過(guò)上面兩個(gè)操作就能產(chǎn)生透明的效果呢?看下圖就理解了:

下面具體說(shuō)明上面兩個(gè)步驟所產(chǎn)生的圖點(diǎn)色彩的變化。


1.屏蔽圖與背景圖做"AND"運(yùn)算

<1>屏蔽圖中的黑色部分與背景圖做"AND"運(yùn)算:

我們?cè)趺礃邮褂脛t會(huì)圖來(lái)處理透明呢?其實(shí)就是Raster運(yùn)算。

將屏蔽圖和背景圖做“AND”運(yùn)算,貼到目的DC; 再將前景圖和背景圖做“OR”運(yùn)算,貼到目的DC;

<2>屏蔽圖中的白色部分與背景圖做"AND"運(yùn)算:

2.前景圖與背景圖做"OR"運(yùn)算

<1>前景圖中的彩色部分與圖第一步得到的“黑色恐龍”圖做"OR"運(yùn)算:

<2>前景圖中的黑色部分與第一步得到的“黑色恐龍”圖做"OR"運(yùn)算:

經(jīng)過(guò)這一運(yùn)算后所顯示的畫(huà)面就是所需的透明圖了,如下圖所示:




現(xiàn)在開(kāi)始編寫(xiě)程序:

在VS2008中新建Win32程序,使用VC默認(rèn)的框架。


#include "stdafx.h"
//全局變量聲明
HINSTANCE hInst;
HBITMAP bg,dra;        //聲明兩個(gè)位圖對(duì)象,分別存儲(chǔ)背景圖與前景恐龍圖
HDC	 mdc;       //聲明一個(gè)內(nèi)存DC"mdc",用來(lái)暫存位圖
//全局函數(shù)聲明
ATOM	 MyRegisterClass(HINSTANCE hInstance);
BOOL	 InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void	 MyPaint(HDC hdc);
////****Winmain函數(shù),程序入口點(diǎn)函數(shù)**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow)) 
{
return FALSE;
}
//消息循環(huán)
while (GetMessage(&msg, NULL, 0, 0)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//****設(shè)計(jì)一個(gè)窗口類(lèi),類(lèi)似填空題,使用窗口結(jié)構(gòu)體*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); 
wcex.style	 = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc	= (WNDPROC)WndProc;
wcex.cbClsExtra	 = 0;
wcex.cbWndExtra	 = 0;
wcex.hInstance	 = hInstance;
wcex.hIcon	 = NULL;
wcex.hCursor	 = NULL;
wcex.hCursor	 = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName	= NULL;
wcex.lpszClassName	= "canvas";
wcex.hIconSm	 = NULL;
return RegisterClassEx(&wcex);
}
//****初始化函數(shù)*************************************
// 1.建立與窗口DC兼容的內(nèi)存DC
// 2.從文件加載背景圖與恐龍圖
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
HDC hdc;
hInst = hInstance;
hWnd = CreateWindow("canvas", "繪圖窗口" , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,10,10,600,450,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);                     //獲得窗口DC
mdc = CreateCompatibleDC(hdc);           //創(chuàng)建與窗口兼容的內(nèi)存DC(mdc)
bg = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE); 
//J加載背景圖到bg中
dra = (HBITMAP)LoadImage(NULL,"dra.bmp",IMAGE_BITMAP,170,99,LR_LOADFROMFILE); 
//加載恐龍圖到dra中
MyPaint(hdc);
ReleaseDC(hWnd,hdc);
return TRUE;
}
//****自定義繪圖函數(shù)*********************************
//透明貼圖
void MyPaint(HDC hdc)
{
SelectObject(mdc,bg);
BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);    //先將背景圖貼到顯示窗口中
SelectObject(mdc,dra);                      //選用恐龍圖到"mdc"中
BitBlt(hdc,280,320,85,99,mdc,85,0,SRCAND);//進(jìn)行制作貼圖的第一步驟,即將屏蔽圖與背景圖做"AND"運(yùn)算,屏蔽圖在整張恐龍圖中,最左上角起始位置點(diǎn)得坐標(biāo)為(85,0),BitBlt()函數(shù)中最后一個(gè)Raster參數(shù)值設(shè)置為SRCAND。
BitBlt(hdc,280,320,85,99,mdc,0,0,SRCPAINT);//進(jìn)行制作透明貼圖的第二步驟,即將前景圖與背景圖做"OR"運(yùn)算,前景圖在整張恐龍圖中,最左上角起始位置的坐標(biāo)為(0,0),BitBlt()函數(shù)最后一個(gè)參數(shù)值設(shè)置為SRCPAINT。
}
//****消息處理函數(shù)**********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:	 //窗口重繪消息
hdc = BeginPaint(hWnd, &ps);
MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:	 //窗口結(jié)束消息
DeleteDC(mdc);
DeleteObject(bg);
DeleteObject(dra);
PostQuitMessage(0);
break;
default:	 //其他消息
return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

熱門(mén)課程推薦

熱門(mén)資訊

請(qǐng)綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請(qǐng)保持電話(huà)暢通!
確定