Vulkan再探(14) 模板測試

2021-10-23 15:12:26 字數 2252 閱讀 7391

08/22/2020

補充知識

參考資料

深度模板附件已經在建立深度時候已經建立好了,現在了解如何使用模板測試畫描邊。首先第乙個管道畫原模型,另乙個管道畫原模型的放大版但是只有純白色,第乙個管道記錄原模型的樣子作為模板刻印到放大版的原模型上就完成了

//第乙個管道

depthstencilstate.stenciltestenable = vk_true;

//開啟模板測試

depthstencilstate.back.compareop = vk_compare_op_always;

//始終記錄原模型的樣子

depthstencilstate.back.failop = vk_stencil_op_replace;

//設定為參考值1

depthstencilstate.back.depthfailop = vk_stencil_op_replace;

//深度測試失敗,也設定為1

depthstencilstate.back.passop = vk_stencil_op_replace;

depthstencilstate.back.comparemask =

0xff

;depthstencilstate.back.writemask =

0xff

;depthstencilstate.back.reference =1;

//參考值為1

depthstencilstate.front = depthstencilstate.back;

vk_check_result

(vkcreategraphicspipelines

(device, pipelinecache,1,

&pipelineci,

nullptr

,&pipelines.stencil));

//第二個管道 -- 放大版的原模型

// outline pass

depthstencilstate.back.compareop = vk_compare_op_not_equal;

// (之前的模板值)!=1

depthstencilstate.back.failop = vk_stencil_op_keep;

//原模型參考值為1,1!=1 失敗的操作,原模型繼續保留

depthstencilstate.back.depthfailop = vk_stencil_op_keep;

//深度測試失敗,應該保持原樣

depthstencilstate.back.passop = vk_stencil_op_replace;

//新的描邊部分設定為參考值為1

depthstencilstate.front = depthstencilstate.back;

depthstencilstate.depthtestenable = vk_false;

shaderstages[0]

=loadshader

(getshaderspath()

+"stencilbuffer/outline.vert.spv"

, vk_shader_stage_vertex_bit)

;shaderstages[1]

=loadshader

(getshaderspath()

+"stencilbuffer/outline.frag.spv"

, vk_shader_stage_fragment_bit)

;vk_check_result

(vkcreategraphicspipelines

(device, pipelinecache,1,

&pipelineci,

nullptr

,&pipelines.outline)

);

layout (binding =

0) uniform ubo

ubo;

void

main()

typedef

struct vkstencilopstate vkstencilopstate;

typedef

enum vkstencilop vkstencilop;

typedef

enum vkcompareop vkcompareop;

模板測試

github 原始碼

再探函式引數

c函式的所有引數均以 傳值呼叫 方式進行傳遞。這意味著函式將獲得引數值的乙份拷貝,這樣函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳遞給它的引數。普通資料型別主要包括 如下面 所示 include void swap int x int y int main 我們原本是希望編寫乙個函式,...

再探迭代器

除了為每個容器定義的迭代器以外,標準庫在標頭檔案iterator中還定義了額外4種迭代器 插入迭代器 流迭代器 反向迭代器 移動迭代器 插入器是一種迭代器介面卡,接受乙個容器,生成乙個插入迭代器 vector vi auto it back inserter vi back inserter是插入器...

遞迴之再探

有人說 遞迴就是有去 遞去 有回 歸來 所以遞迴過程可以分解為兩部分,一部分為分解,一部分為求解。具體來說,為什麼可以有去?這要求遞迴的問題需要是可以用同樣的解題思路來回答除了規模大 小不同其他完全一樣的問題。為什麼可以有回?這要求這些問題不斷從大到小,從近及遠的過程中,會有乙個終點,乙個臨界點,乙...