DirectX11學習筆記 4 文字的渲染

2021-08-09 08:34:02 字數 4533 閱讀 9060

遊戲中的文字有多種實現方式,比如在螢幕上進行幾何貼圖,使用向量繪製,甚至僅僅使用標準訊息盒。

在2d和3d遊戲中,文字通常使用貼圖的幾何圖形進行繪製

動態文字系統通重載入在字型中包含的任何字母的單一貼圖來構建那些文字字串

這裡的建立頂點快取是動態的:

**設定如下:

hresult d3dtextdemo::createtextvertices(float width, float height) ,

, ,

, ,

, };

//建立頂點描述

d3d11_buffer_desc vertexdesc; //建立頂點描述

zeromemory(&vertexdesc, sizeof(vertexdesc));

vertexdesc.usage = d3d11_usage_dynamic; //動態快取 能夠通過cpu來動態更新

vertexdesc.cpuaccessflags = d3d11_cpu_access_write; //動態寫 為了讓cpu能夠對gpu中的資源進行寫訪問

vertexdesc.bindflags = d3d11_bind_vertex_buffer; //繫結頂點快取

const int sizeofsprite = sizeof(vertexpos) * 6;

const int maxletters = 24;

vertexdesc.bytewidth = sizeofsprite * maxletters;

d3dresult = d3ddevice_->createbuffer(&vertexdesc, null, &vertexbuffer_); //子資源引數設定為null 我們對頂點快取的內容進行動態更新 從而建立時我們不需要設定任何資料

if (failed(d3dresult))

return true;

}

這裡經過了一些修改:

(1) 設定使用標識為d3d11_usage_dynamic 來允許我們的快取能夠通過cpu來動態更新

(2) 設定cpu訪問標識為d3d11_cpu_access_write  為了讓cpu能夠對gpu中的資源進行持續訪問

(3) createbuffer的時候,我們將子資源引數設定為null

drawstring函式的設定:

sizeofsprite----以位元組為單位單個精靈的尺寸。乙個精靈是由6個頂點組成的兩個三角形

maxletters----最多渲染幾個

length----我們需要渲染的字串的長度

charwidth----單個字母在螢幕上的寬度

charheight----單個字母在螢幕上的高度

texelwidth----單個字母在紋理影象中的寬度

verticespreletter-----在每個精靈中儲存所有頂點的常量

函式設定如下:

與使用迴圈索引來計算頂點位置不同的是 我們使用字母本身來產生貼圖的座標

這可以通過使用每個字母的ascii碼來計算出

bool d3dtextdemo::drawstring(char* message, float startx, float starty) 

vertexpos* sprintfptr = (vertexpos*)mapresource.pdata; //獲得乙個指標指向子資源pdata 可以迴圈設定需要組裝的字串和幾何圖案

const int indexa = static_cast('a');

const int indexz = static_cast('z');

for (int i = 0; i < length; ++i)

else

float tustart = 0.0f + (texelwidth * static_cast(texlookup));

float tuend = tustart + texelwidth;

sprintfptr[0].tex0 = xmfloat2(tuend, 0.0f);

sprintfptr[1].tex0 = xmfloat2(tuend, 1.0f);

sprintfptr[2].tex0 = xmfloat2(tustart, 1.0f);

sprintfptr[3].tex0 = xmfloat2(tustart, 1.0f);

sprintfptr[4].tex0 = xmfloat2(tustart, 0.0f);

sprintfptr[5].tex0 = xmfloat2(tuend, 0.0f);

sprintfptr += 6;

} d3dcontext_->unmap(vertexbuffer_, 0);

d3dcontext_->draw(6 * length, 0);

return true;

}

怎樣讀取貼圖並將貼圖中的

文字進行渲染?

(1)首先在d3dcontext_中匯入貼圖

d3dcontext_->iasetinputlayout(inputlayout_);

d3dcontext_->iasetvertexbuffers(0, 1, &vertexbuffer_, &stride, &offset);

d3dcontext_->iasetprimitivetopology(d3d11_primitive_topology_********list);

d3dcontext_->vssetshader(solidcolorvs_, 0, 0);

d3dcontext_->pssetshader(solidcolorps_, 0, 0);

d3dcontext_->pssetshaderresources(0, 1, &colormapfortexta_); //在這裡匯入貼圖

d3dcontext_->pssetsamplers(0, 1, &colormapsampler_);

(2)然後通過drawstring中的map函式

hresult d3dresult = d3dcontext_->map(vertexbuffer_, 0, d3d11_map_write_discard, 0, &mapresource);   //通過map來訪問快取中的物件 通過maoresource來進行訪問

//mapresource會訪問資源中的內容

之後我們獲得乙個指標指向子資源的pdata 就可以迴圈設定需要組裝的字串的幾何圖案了

我們使用乙個for-loop的迭代器來遍歷字串

texlookup的作用:

x的開始位置是精靈的左邊 x的結束位置是精靈的右邊 這相當於將x的開始位置加上每乙個字母的寬度

貼圖座標的設定:將當前字母的ascii碼與a的ascii碼作差 如果當前字母是a得到0 b則得到1

迴圈索引i以0開始依次遞增

而texlookup 變數用0表示並依次遞增

texlookup = (letter - indexa);
letter是char型別的字元 這樣可以推出字元的ascii碼來判斷這是哪乙個字元

關於透明度的設定:

混合描述物件:

id3d11blendstate* alphablendstate_;

然後設定alpha通道:

d3d11_blend_desc blendstate;

zeromemory(&blendstate, sizeof(blendstate));

blendstate.rendertarget[0].blendenable = true;

blendstate.rendertarget[0].blendop = d3d11_blend_op_add;

blendstate.rendertarget[0].srcblend = d3d11_blend_src_alpha;

blendstate.rendertarget[0].destblend = d3d11_blend_one;

blendstate.rendertarget[0].blendopalpha = d3d11_blend_op_add;

blendstate.rendertarget[0].srcblendalpha = d3d11_blend_zero;

blendstate.rendertarget[0].destblendalpha = d3d11_blend_zero;

blendstate.rendertarget[0].rendertargetwritemask = 0x0f;

float blendfactor[4] = ;

d3ddevice_->createblendstate(&blendstate, &alphablendstate_);

d3dcontext_->omsetblendstate(alphablendstate_, blendfactor, 0xffffffff);

DirectX11 學習筆記(14) 點光源

好久沒有更新部落格了。最近一直在忙一些其他的事情 dx都快忘了 今天繼續更新!上次說到簡單光照,今天我們就學習乙個點光源 影響點光源的因素主要有 範圍,位置,衰減 其中衰減用乙個二次方程來表達 attenuation att0 att1 d att2 d att0 常量修飾符 由於此值未乘以任何值,...

DirectX11渲染過程

網易作業deadline 要涼了555 對directx初始化完成後,就可以進行渲染了。struct vs input 輸入資料的格式 struct vs output 輸出資料的格式 vs output main vs input input 編譯之後生成cso檔案,使用readfiletoblo...

DirectX11學習筆記(不定期更新)

目錄 1 dx與hlsl的矩陣 2 建立常量緩衝區的尺寸需要按照16位元組對齊 dx的矩陣 directx xmmatrix 按照行主元優先儲存,而hlsl的矩陣預設按照列主元優先儲存。解決這個問題的方法有兩種 1 將directx的矩陣轉置 directx xmmatrix m matrix di...