2016-04-15 30 views
1

我有一個二維數組(256x16),我需要加載到Vulkan樣式紋理中進行採樣。在OpenGL中,只需使用glTexImage2D或glTexSubImage2D即可完成。但是,我不知道如何在Vulkan中做同樣的事情。在Vulkan中從陣列創建紋理的步驟是什麼?

陣列被定義如下:

static const int triTable[256][16] = 
{ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, 
{ 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, 
... 
... 
{ 0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, 
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }; 
+0

是什麼值-1是什麼意思?實際上,這些數值意味着什麼都不清楚。這些RGBA顏色是否是單通道圖像?你想要創建什麼格式的紋理? –

+0

這是一個體素邊緣列表,需要在行進立方體算法下用於地形生成的頂點。每個16長度列表包含表示這些邊緣的0-12個數字。 -1只是一個空值,並且有16個值保持爲兩個寬度的冪(我假設,因爲我沒有創建這個列表)。它們將在圖像中以一個通道(紅色)表示。 –

+0

你想上傳這個紋理爲什麼bitdepth?你想要一個整數格式還是一個浮點格式?你打算使用什麼VK_FORMAT? –

回答

1
  1. 創建適當USAGE_TRANSFER_SRC VkBuffer(或TILING_LINEAR USAGE_TRANSFER_SRC VkImage也可以被使用,但是較不規範的方法)。

  2. 查詢它的內存需求。然後根據主機可見內存中的內容進行分配,並將該內存綁定到緩衝區(或圖像)。

  3. 映射內存。複製您的數據(如果您選擇使用圖像,請觀察vkGetImageSubresourceLayout()信息)。取消映射內存。

  4. 通過vkCmdCopyBufferToImage()(或vkCmdCopyImage())將數據複製到最終期望的(理想優化的)VkImage中。

  5. 完成。一些同步和其他樣板可能是必要的在那裏...

如果你不確定,只是劫持某人elses代碼,例如, https://github.com/SaschaWillems/Vulkan

+0

您錯過了必須查詢最佳平鋪圖像所需內存量並創建該圖像並將其附加到相應內存的部分。最好使用緩衝區進行分級,而不要使用線性平鋪圖像。 –

+0

a)是的,我把它當作外部代碼/已經存在(甚至沒有創建它)。 b)可能是這樣,我只是不喜歡它,因爲它切片語義,我沒有發現很多優勢。我想我會編輯答案... – krOoze

+0

相信我,我從Sascha劫持了我所能​​做的一切。我似乎無法將我的頭圍繞在創建紋理的過程中,我猜想。再加上你提到的「同步和樣板」並不是我已經完全理解的東西。 –

0
  1. 創建VkImage然後getMemoryRequirements,分配內存和 vkBindImageMemory。
  2. 通過映射此內存填充內容。

  3. 創建一個命令緩衝區並記錄它,用於轉換 圖像的佈局並提交它。

  4. 從圖像創建採樣器和圖像視圖。

我有一個代碼在這裏link

檢查功能:InitTexture和CreateSampler

相關問題