今天又看了另外一個官方參考代碼GraphicsSamples-master。初步了解了下代碼框架。然后發(fā)現(xiàn)了某些內(nèi)容基本上是公用的,不變的。
- 初始化Instance。
- 初始化物理設(shè)備。
- 初始化邏輯設(shè)備。
- 初始化command buffer。
- 初始化rander pass。
問題
1. command buffer意義及用法?
之前只是初步了解,但是現(xiàn)在又混淆了,command buffer有兩個特別的命令,一個是vkBeginCommandBuffer,另外一個是vkEndCommandBuffer。后來搜索了vulkan spec及網(wǎng)上搜索后,明白了。command buffer是和物理設(shè)備打交道最近的了。物理設(shè)備的特性queue,則對應一個command pool(所以用vkCreateCommandPool)。而command pool又由command buffer組成(所以要用vkAllocateCommandBuffers)來綁定pool和buffer。而vkBeginCommandBuffer調(diào)用后則開始寫入命令到queue。是不是把這些內(nèi)容連接起來了。物理queue<->command pool<->command buffer的關(guān)系鏈就是這樣設(shè)置的。

關(guān)于vkBeginCommandBuffer和vkEndCommandBuffer以及vkQueueSubmit提交命令是對數(shù)據(jù)的操作。


2.渲染通道和圖形管道有什么區(qū)別?
渲染通道是設(shè)置配置方式,圖形管道是綁定了圖像,渲染方式等的集合。
渲染通道設(shè)置有這2個步驟
1)渲染通道附件描述
2)子通道描述
3)渲染通道創(chuàng)建
在 Vulkan 中,渲染通道代表(或描述)執(zhí)行繪制操作所需的幀緩沖區(qū)附件(圖像)集,以及排列繪制操作的子通道集合。 它是一種收集所有顏色、深度與模板附件,以及操作的構(gòu)造,對它們進行修改后,驅(qū)動程序無需自己推斷這種信息,從而為部分 GPU 提供了重要的優(yōu)化機會。
我的理解就是設(shè)置方式的打包集合。主要設(shè)置顏色、深度與模板附件。
3.光柵化中采樣如何理解?
圖片1展示了用一個方塊來描述像素的。實際上,像素是點,不是方塊,每個圖片1中的方塊表明了被一個像素點亮的區(qū)域,然而像素始終是方塊中間的一個點,這個區(qū)別,看起來很小,但是很重要

因為每個像素點亮區(qū)域只能是一種顏色,不可能一半有顏色一半沒有顏色。如果可以像上面這樣顯示,那么矩形邊緣的像素區(qū)域必須顯示兩種不同的顏色:藍色的部分表示在矩形內(nèi),白色的部分表示在矩形外。
因此,圖形硬件將會執(zhí)行判斷哪個像素應該被點亮以接近真正的矩形的任務。這個過程被稱之為光柵化

屏幕空間原點是左上角的物理像素,但是紋理坐標原點是紋素矩形的最左上角。最重要的是,記住當你要將紋理中的紋素正確的映射到屏幕空間中的像素時,你需要減去0.5個單位
參考網(wǎng)址
http://www.itdecent.cn/p/9ee2adb26969
https://software.intel.com/zh-cn/articles/api-without-secrets-introduction-to-vulkan-part-3
https://blog.csdn.net/fishmai/article/details/63257662
報錯代碼設(shè)計
不錯的設(shè)計方式,備份下。
void checkVkResult(const char* file, int32_t line, VkResult result);
#ifndef CHECK_VK_RESULT
#define CHECK_VK_RESULT() checkVkResult(__FILE__, __LINE__, result)
#endif
void checkVkResult(const char* file, int32_t line, VkResult result)
{
#define STR(a) case a: errorString = #a; break;
if (result != VK_SUCCESS)
{
const char* errorString = 0;
switch (result)
{
//STR(VK_SUCCESS);
STR(VK_NOT_READY);
STR(VK_TIMEOUT);
STR(VK_EVENT_SET);
STR(VK_EVENT_RESET);
STR(VK_ERROR_INITIALIZATION_FAILED);
STR(VK_ERROR_OUT_OF_HOST_MEMORY);
STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
STR(VK_ERROR_DEVICE_LOST);
STR(VK_ERROR_MEMORY_MAP_FAILED);
STR(VK_ERROR_INCOMPATIBLE_DRIVER);
default: errorString = "unknown error"; break;
}
#undef STR
LOGE("VK error: %s, line %d: %s\n", file, line, errorString);
NV_ASSERT(result == VK_SUCCESS);
result = VK_SUCCESS; // nice place to hang a breakpoint in compiler... :)
}
}