2016-12-06 138 views
0

根據我的理解,片段着色器從光柵化中獲取結果。然而,根據計算機圖形學:原理與實踐(第3版),光柵化將計算基於照明在各個方向上的片段的顏色:片段着色器會覆蓋從光柵化生成的片段顏色?

for each pixel position (x, y): 
closest[x, y] = ∞ 
for each triangle T: 
    for each pixel position (x, y): 
    let R be the ray through (x, y) from the eye 
    let P be the intersection of R and T 
    if P exists: 
     sum = 0 
     for each direction: 
      sum += . . . 
      if the distance to P is less than closest[x, y]: 
      pixel[x, y] = sum 
      closest[x, y] = |P − O| 

所以片段彩色像素[X,Y]的計算基在現場照明。因此,在此之後,片段着色器會將顏色,紋理等應用到每個片段。片段着色器或紋理中的顏色與從光柵化計算出的顏色混合的方式如何?

回答

1

片段着色器是您的柵格化過程的實現,所描述的柵格化是由着色器在固定管道中完成的,靈活的管道使用您提供的着色器程序。

來自opengl文檔: 片段着色器是着色器階段,它將把由聚合生成的片段處理爲一組顏色和單個深度值。

片段着色器是基元被光柵化後的OpenGL管線階段。對於由基元覆蓋的像素的每個樣本,生成「片段」。每個片段都有一個窗口空間位置和一些其他值,它包含所有來自最後一個頂點處理階段的插值的每頂點輸出值。

片段着色器的輸出是一個深度值,一個可能的模板值(片段着色器未修改)以及零個或多個可能寫入當前幀緩衝區中的緩衝區的顏色值。

如果片段着色器沒有提供在片段像素的色彩會留未修改

+0

」片段着色器的輸出是深度值「。根據我的理解,深度值是在光柵化期間計算的。 – lightrek

+0

片段着色器是你的光柵化過程的實現嗎?我認爲片段着色器是在柵格化之後進行的。 – lightrek

+0

@lightrek:這不完全準確。可以在光柵化過程中計算深度,但片段着色器有最終的說法。如果片段着色器從不寫入深度,則可以使用柵格化值,並且硬件設計用於執行早期深度測試,並在此場景中跳過對任何失敗片段的着色。但是,如果片段着色器將任何內容寫入'gl_FragDepth',則深度測試必須在着色後執行。出於同樣的原因,模板測試也可以提前完成;有一整套「早期片段測試」。 –

1

你的理解是正確的,陰影光柵化後會發生。

這是光柵化和輸出合併(混合)之間的可編程步驟。柵格化插值(非平坦)每個頂點屬性,並使用它計算的值爲每個片段生成一個或多個樣本。

在柵格化過程中計算的值被傳遞到片段着色器階段,該階段決定如何處理它們(例如,在特定座標處對紋理進行採樣)以產生顏色和深度。在着色之後,根據設置混合等式將通過深度/模板測試的片段與已存在於幀緩衝區中的任何片段合併(混合)以產生像素。 「