簡體   English   中英

什么是Apple的Metal(金屬着色器語言)紋理坐標?

[英]What are Apple's Metal (Metal Shader Language) texture coordinates?

在iOS或OS / X中,Metal Shader Language內核函數使用了什么紋理坐標? 例如,給定MTLTextureuint2 gid[[thread_position_in_grid]] gid.xgid.y介於0..1(x和y是浮點數)或0 .. inTexture.get_width() (x和y是整數)之間。

提前致謝

thread_position_in_grid是網格中的索引(整數),它采用您在dispatchThreadgroups:threadsPerThreadgroup:指定的范圍中的值dispatchThreadgroups:threadsPerThreadgroup: . 由您決定所需的線程組數以及每組的線程數。

在下面的示例代碼中,您可以看到threadsPerGroup.width * numThreadgroups.width == inputImage.widththreadsPerGroup.height * numThreadgroups.height == inputImage.height 在這種情況下,網格中的位置因此將是非標准化(整數)像素坐標。

每次在Metal中啟動計算着色器都會伴隨一個密集的矩形3D網格線程ID。 調用[MTLComputeCommandEncoder dispatchThreadGroups:threadsPerThreadgroup:]時,將設置網格的尺寸。 例如,您可以將線程組大小設置為{16,16,1} (線程組中的256個線程為16x16x1平方),線程組計數為{1,2,1} ,這將導致兩個線程組以形狀{16,32,1}的512個線程的總面積。 這些是作為[[thread_position_in_grid]]出現在內核頂部的整數。 線程位置是您告訴哪個線程的方式,就像dispatch_apply()傳遞給塊的threadID參數一樣。

Metal指定從[[thread_position_in_grid]]到紋理中的坐標的映射。 這是由您在計算着色器中的軟件中完成的。 如果要在圖像中的某個偏移處讀取紋理區域中的每個其他像素,則需要將threadID乘以2並在將新坐標傳遞給texture2d.sample之前在內核中添加偏移量。 由於Metal無法啟動部分線程組,因此您需要確保不執行不需要的線程組。 例如,當應用於較小的紋理時,32x64啟動的完整大小可能會導致您注銷紋理的末尾。 在這種情況下,您必須檢查threadID以查看線程是否將注銷結束,然后返回着色器或跳過該線程的紋理寫入調用以避免此問題。

thread_position_in_grid始終由無符號整數組成,並提供這些選項,但它們都不與紋理坐標相關。 提出另一個相關問題可能會有所幫助,因為您似乎正在混淆紋理和內核函數的概念。

  • 16位或-32位
  • 1D,2D或3D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM