[英]What are Apple's Metal (Metal Shader Language) texture coordinates?
在iOS或OS / X中,Metal Shader Language內核函數使用了什么紋理坐標? 例如,給定MTLTexture
和uint2 gid[[thread_position_in_grid]]
gid.x
和gid.y
介於0..1(x和y是浮點數)或0 .. inTexture.get_width()
(x和y是整數)之間。
提前致謝
thread_position_in_grid
是網格中的索引(整數),它采用您在dispatchThreadgroups:threadsPerThreadgroup:
指定的范圍中的值dispatchThreadgroups:threadsPerThreadgroup:
. 由您決定所需的線程組數以及每組的線程數。
在下面的示例代碼中,您可以看到threadsPerGroup.width * numThreadgroups.width == inputImage.width
和threadsPerGroup.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
始終由無符號整數組成,並提供這些選項,但它們都不與紋理坐標相關。 提出另一個相關問題可能會有所幫助,因為您似乎正在混淆紋理和內核函數的概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.