簡體   English   中英

片段着色器是否處理頂點着色器中的所有像素?

[英]Does fragment shader process all pixels from vertex shader?

如果我的管道中只有頂點着色器和片段着色器,那么我想知道的是,片段着色器是從頂點着色器接收每個單獨的處理過的頂點還是要等到所有傳遞到該頂點的值在將着色器提供給片段着色器以分別處理每個像素還是一次處理所有着色器之前先對其進行處理?

同樣,片段着色器是否在每次執行頂點着色器之后立即執行,而不是在頂點着色器獲取下一個頂點或頂點輸入之前進行處理?

這意味着如果我讓片段着色器執行此操作:

const GLchar * vertex_shader_source = {
    "#version 430 core\n"
    "layout(location = 0) in vert;\n"
    "void main(void)\n"
    "{\n"
    "gl_Position = vert;\n"
    "}\n"
};
const GLchar * fragment_shader_source = {
    "#version 430 core\n"
    "out vec4 color;\n"
    "void main(void)\n"
    "{\n"
    "color = vec4(gl_VertexID/100,gl_VertexID/100,gl_VertexID/100,1.0f);\n"
    "}\n"
};

片段着色器實際上是否與緩沖區中正在處理的每個頂點索引同步?

您的問題有誤導性。 片段着色器不是接收頂點的情況。 他們收到碎片。 在頂點着色器和片段着色器之間,有很多硬件需要多個頂點,在其中形成三角形,對其進行一堆處理(剔除,剪切...),然后對其進行柵格化(將三角形轉換為一堆覆蓋的正方形) )生成將在片段着色器上執行的片段。

這就是說從頂點ID到片段沒有自然的映射(實際上,您需要多個頂點才能生成片段,而且在許多情況下,單個頂點也會對多個三角形有所貢獻)。

因此,根本沒有辦法在片段着色器中有意義地使用gl_VertexID。

現在,關於“頂點着色器是否先於片段運行”或諸如此類的問題……生成的任何片段都必須已經計算了頂點位置(因為這需要計算片段覆蓋率)。 但這是您將獲得的唯一保證。

例如,基於圖塊的延遲渲染器通常會在整個幀上首先處理所有頂點(在整個幀上!),只有稍后再處理一幀,它將處理所有片段。 相反,“立即模式渲染器”將傾向於在三角形可用時對其進行處理。 真正觀察這些事物的方法並不多,我不知道有很多人對幾種可用的方法進行了觀察。

暫無
暫無

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

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