假設金屬頂點着色器A
更新緩衝區buf
。另外假設我有第二個頂點着色器B
,它在A
之後編碼。 B
可以使用buf
中的結果嗎?B
可能會在A
結束之前開始執行,這意味着緩衝區的內容尚未準備好?金屬在下一個頂點着色器執行之前是否完成一個頂點着色器?
回答
第二個頂點着色器B
可以在頂點着色器A
之前自由執行,如果它們編碼在相同的MTLRenderCommandEncoder
。如果您想要讀取B
中的A
的輸出,那麼它們必須由單獨的MTLRenderCommandEncoder
編碼。
但是,請注意,相同的是而不是在MTLComputeCommandEncoder
內的計算調度的真實性。所述relevant part of the doc狀態:
執行計算命令
爲了編碼命令來執行一個計算 功能,調用dispatchThreadgroups:threadsPerThreadgroup:方法MTLComputeCommandEncoder的 並指定線程組的尺寸和 線程組的數目。您可以查詢MTLComputePipelineState的threadExecutionWidth和 maxTotalThreadsPerThreadgroup屬性爲 優化此設備上計算功能的執行。
對於compute函數的最高效的執行,設置由threadsPerThreadgroup參數傳遞給 dispatchThreadgroups指定的線程的總數 :threadsPerThreadgroup:方法來 threadExecutionWidth的倍數。線程組中的線程總數爲 threadsPerThreadgroup組件的乘積: threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth。 maxTotalThreadsPerThreadgroup 屬性指定在單個線程組中可以在該設備上執行此計算功能的最大線程數。
計算命令按其編碼爲 的順序執行到命令緩衝區中。當與命令完成執行相關聯的所有 線程組以及所有 結果寫入內存時,compute命令將結束執行。由於這種排序,計算命令的結果 可用於在命令緩衝區中編碼後的任何命令。
要結束計算命令編碼器的編碼命令,請調用MTLComputeCommandEncoder的endEncoding方法。 結束前一個命令編碼器後,可以創建任何類型的新命令編碼器 以將其他命令編碼到命令緩衝區中。
- 1. 頂點着色器與頂點
- 2. GLSL:頂點着色器無片段着色片段着色器
- 3. Matrix.CreateRotation VS頂點着色器
- 4. 頂點着色器問題
- 5. 從頂點着色器
- 6. 表面着色器中的統一着色器頂點格式
- 7. OpenglES 2.0頂點着色器屬性
- 8. 從頂點着色器傳遞一個浮動的片段着色器
- 9. 在OpenGL ES 2.0頂點着色器中生成頂點
- 10. 什麼是頂點着色?
- 11. 在同一個程序中使用多個頂點着色器
- 12. GLSL點燃頂點着色器
- 13. 更改頂點着色器中頂點的顏色
- 14. 頂點着色器和片段着色器
- 15. 開始的金屬着色器頂點溢出
- 16. 不同的頂點格式的金屬着色器
- 17. 用金屬調用頂點着色器多少次?
- 18. 爲什麼在頂點着色器之後處理幾何着色器?
- 19. 座標輸出CG頂點着色器
- 20. 重用頂點通入着色器
- 21. 調試directx像素/頂點着色器?
- 22. 如何乘頂點着色器
- 23. THREE.js - 廣告牌頂點着色器
- 24. GLSL頂點着色器編譯錯誤
- 25. 無法鏈接glsl頂點着色器
- 26. GLSL頂點着色器gl_Position值
- 27. 頂點着色器中的邊界框
- 28. OpenGl基本頂點着色器
- 29. DirectX 11頂點着色器反射
- 30. 頂點着色器粒子運動
寫入一個渲染命令編碼器在隨後的命令編碼器中可見。在平局級別沒有這樣的保證。 – warrenm
頂點着色器輸出點。您也可以將它們用作生成將由片段着色器進行插值的數據的機會。你沒有用它們寫入緩衝區。你在着色器中寫什麼緩衝區?頂點着色器如何更新緩衝區?你是否想要問一個計算着色器而不是頂點着色器? –
您可以從頂點着色器寫入設備緩衝區,就像在計算着色器中一樣。看起來我可以通過更新頂點着色器中的某些緩衝區而不是寫入專用計算着色器來節省一些開銷。只是不確定在完成先前繪圖命令之前GPU是否開始處理下一個繪圖命令,從而使得從頂點着色器更新的設備緩衝器的內容不可預測。 Apple文檔似乎沒有解決這個問題,因爲它不符合頂點着色器的典型用法。 – gloo