一種Direct3D11在WIN7系統(tǒng)下顯示R5G6B5格式紋理圖像的方法與裝置的制造方法
【專(zhuān)利說(shuō)明】
法與裝置
技術(shù)領(lǐng)域
[0001 ]本發(fā)明屬于圖形圖像顯示技術(shù)領(lǐng)域,更具體地,涉及一種Direct3Dll在WIN7系統(tǒng)下顯示R5G6B5格式紋理圖像的方法與裝置。
【背景技術(shù)】
[0002]圖像的文件格式是圖像為了存儲(chǔ)信息而使用的對(duì)信息的特殊編碼方式,它存儲(chǔ)在磁盤(pán)中或者內(nèi)存中,但是并不能被圖形處理器(Graphics Processing Unit, GPU)所識(shí)別,因?yàn)橐韵蛄坑?jì)算見(jiàn)長(zhǎng)的GHJ對(duì)于這些復(fù)雜的計(jì)算無(wú)能為力。圖像的格式紋理是能被GPU所識(shí)別的像素格式,能被快速尋址并采樣。常用的圖像文件格式有BMP,TGA,JPG,GIF,PNG等;常用的格式紋理有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8,B8G8R8A8等。當(dāng)這些文件格式被游戲讀入后,需要經(jīng)過(guò)中央處理器(Central Processing Unit,CPU)解壓成R5G6B5、A4R4G4B4、A1R5G5B5、R8G8B8、B8G8R8A8等像素格式,再傳送到GPU端進(jìn)行使用。其中R5G6B5、A4R4G4B4、A1R5G5B5、R8G8B8、B8G8R8A8均為GUP中可顯示的紋理格式。
[0003]Direct3D是由微軟公司所制定的3D規(guī)格界面,與Windows 95和Windows NT操作系統(tǒng)兼容性好,可繞過(guò)圖形顯示接口(Graphics Device Interface,⑶I)直接進(jìn)行支持該應(yīng)用程序接口(Applicat1n Programming Interface ,ΑΡΙ)的各種硬件的底層操作,大大提高了游戲的運(yùn)行速度。Direct3Dll在WIN7系統(tǒng)下無(wú)法直接利用GPU顯示R5G6B5格式的紋理,至IJ 了 WIN8及以上系統(tǒng)中才可以直接利用GPU創(chuàng)建并顯示R5G6B5格式的紋理。因此當(dāng)前為了在WIN7系統(tǒng)下顯示R5G6B5格式的紋理,通常是由CPU下發(fā)轉(zhuǎn)換執(zhí)行指令在內(nèi)存中將R5G6B5格式的圖像轉(zhuǎn)換成B8G8R8A8格式的圖像,然后在Direct3Dl 1中顯示,這大大增加了 CPU的工作壓力。
【發(fā)明內(nèi)容】
[0004]針對(duì)現(xiàn)有技術(shù)的以上缺陷或改進(jìn)需求,本發(fā)明提供了一種Direct3Dll在WIN7系統(tǒng)下顯示R5G6B5格式紋理的方法與裝置,通過(guò)將R5G6B5格式紋理圖像輸入到DXGI_F0RMAT_R8G8JJN0RM格式的紋理中,然后將DXGI_F0RMAT_R8G8_UN0RM格式的紋理中的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM 格式的紋理中的像素值,然后將 DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理進(jìn)行顯示,從而實(shí)現(xiàn)了通過(guò)Direct3Dll在WIN7系統(tǒng)下顯示R5G6B5格式紋理圖像。
[0005]為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種Direct3Dll在WIN7系統(tǒng)下顯示R5G6B5格式紋理圖像的方法,包括如下步驟:
[0006](1)獲取待顯示的R5G6B5格式紋理圖像的大小;
[0007](2)創(chuàng)建與上述待顯示的R5G6B5格式紋理圖像大小相同的DXGI_F0RMAT_R8G8_UN0RM格式的紋理;
[0008](3)將上述待顯示的R5G6B5格式紋理圖像輸入到上述DXGI_F0RMAT_R8G8_UN0RM格式的紋理中;
[0009](4)將上述DXGI_F0RMAT_R8G8_UN0RM格式的紋理中各紋理坐標(biāo)處的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理中對(duì)應(yīng)紋理坐標(biāo)處的像素值;
[0010](5)將上述DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理進(jìn)行顯示。
[0011 ] 本發(fā)明的一個(gè)實(shí)施例中,所述步驟(4)中按照如下規(guī)則將DXGI_F0RMAT_R8G8_UN0RM格式的紋理中各紋理坐標(biāo)處的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理中對(duì)應(yīng)紋理坐標(biāo)處的像素值:
[0012]DXGI_F0RMAT_B8G8R8A8_UN0RM格式紋理中的[R0-R4]對(duì)應(yīng)DXGI_F0RMAT_R8G8_UN0RM格式紋理中的[B0-B4 ];
[0013]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[B0-B7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([R0-R4 ] *8+ [R0-R2]);
[0014]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[G0-G7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([G0-G2]*32+[R5-R7]*4);
[0015]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[R0-R7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([G3-G7]*8+[G3-G5]);
[0016]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[A0-A7] =255;
[0017]其中DXGI_F0RMAT_R8G8_UN0RM格式紋理圖像中,每個(gè)像素點(diǎn)包括2個(gè)字節(jié)的數(shù)據(jù),從左往右為從低字節(jié)到高字節(jié),表示為[R0-R7][G0-G7],其中[R0-R7]表示每個(gè)像素點(diǎn)的紅色部分,[G0-G7]表示每個(gè)像素點(diǎn)的綠色部分;
[0018]DXGI_F0RMAT_B8G8R8A8_UN0RM格式紋理圖像中,每個(gè)像素包括4個(gè)字節(jié)的數(shù)據(jù),從左往右為從低字節(jié)到高字節(jié),表示為[B0-B7 ] [G0-G7] [R0-R7 ] [A0-A7],其中[B0-B7]表示每個(gè)像素點(diǎn)的藍(lán)色部分,[G0-G7]表示每個(gè)像素點(diǎn)的綠色部分,[R0-R7]表示每個(gè)像素點(diǎn)的綠色部分,[A0-A7]表示每個(gè)像素點(diǎn)的透明度。
[0019]本發(fā)明的一個(gè)實(shí)施例中,所述步驟(4)中按照如下方式將DXGI_F0RMAT_R8G8_UN0RM格式的紋理中各紋理坐標(biāo)處的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理中對(duì)應(yīng)紋理坐標(biāo)處的像素值:
[0020]r8 = bit(G8,3,7)*8+bit(bit(G8,3,7),0,2);
[0021]lg3 = bit(G8,0,2);
[0022]hg3 = bit(R8,5,7);
[0023]g8 = lg3*32+hg3*4;
[0024]b8 = bit(R8,0,4)*8+bit(bit(R8,0,4),0,2);
[0025]計(jì)算最終的B8G8R8A8的值為ARGB(b8,g8,r8,255)。
[0026]其中R8為DXGI_F0RMAT_R8G8_UN0RM格式紋理中的[R0-R7]; G8為DXGI_F0RMAT_R8G8_UN0RM格式紋理中的[G0-G7],bit (byte,start,end)函數(shù)為獲取一個(gè)字節(jié)從start比特位到end比特位的值。
[0027]按照本發(fā)明的另一方面,還提供了一種Direct3Dll在WIN7系統(tǒng)下顯示R5G6B5格式紋理圖像的裝置,其特征在于,包括圖像大小獲取模塊、R8G8紋理生成模塊、R5G6B5圖像輸入模塊、B8G8R8A8紋理轉(zhuǎn)換模塊以及B8G8R8A8紋理顯示模塊,其中:
[0028]所述圖像大小獲取模塊,用于獲取待顯示的R5G6B5格式紋理圖像的大?。?br>[0029]所述R8G8紋理生成模塊,用于創(chuàng)建與上述待顯示的R5G6B5格式紋理圖像大小相同的 DXGI_F0RMAT_R8G8_UN0RM 格式的紋理;
[0030]所述R5G6B5圖像輸入模塊,用于將上述待顯示的R5G6B5格式紋理圖像輸入到上述DXGI_F0RMAT_R8G8_UN0RM格式的紋理中;
[0031 ] 所述B8G8R8A8紋理轉(zhuǎn)換模塊,用于將上述DXGI_F0RMAT_R8G8_UN0RM格式的紋理中各紋理坐標(biāo)處的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理中對(duì)應(yīng)紋理坐標(biāo)處的像素值;
[0032]所述B8G8R8A8紋理顯示模塊,用于將上述DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理進(jìn)行顯示。
[0033]本發(fā)明的一個(gè)實(shí)施例中,所述B8G8R8A8紋理顯示模塊按照如下規(guī)則將DXGI_F0RMAT_R8G8_UN0RM格式的紋理中各紋理坐標(biāo)處的像素值轉(zhuǎn)化為DXGI_F0RMAT_B8G8R8A8_UN0RM格式的紋理中對(duì)應(yīng)紋理坐標(biāo)處的像素值:
[0034]DXGI_F0RMAT_B8G8R8A8_UN0RM格式紋理中的[R0-R4 ]對(duì)應(yīng)DXGI_F0RMAT_R8G8_UN0RM格式紋理中的[B0-B4 ];
[0035]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[B0-B7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([R0-R4 ] *8+ [R0-R2]);
[0036]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[G0-G7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([G0-G2]*32+[R5-R7]*4);
[0037]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[R0-R7] = DXGI_F0RMAT_R8G8_UN0RM格式紋理中的([G3-G7]*8+[G3-G5]);
[0038]DXGI_F0RMAT_B8G8R8A8_UN0RM 格式紋理中的[A0-A7] =255;
[0039]其中DXGI_F0RMAT_R8G8_UN0RM格式紋理圖像中,每個(gè)像素點(diǎn)包括2個(gè)字節(jié)的數(shù)據(jù),從左往右為從低字節(jié)到高字節(jié),表示為[R0-R7][G0-G7],其中[R0-R7]表示每個(gè)