2015-01-06 82 views
0

我是一名初學者,我嘗試畫一個正方形畫一個圓。但失敗了!這是我的頂點着色器:頂點着色器如何工作?

#define RADIUS 0.5 
#define WHITE vec4(1.0,1.0,1.0,1.0) 
#define RED vec4(1.0,0.0,0.0,1.0) 
attribute vec2 a_position; 
varying vec4 v_color; //defines color in fragment shader 
.... 
void main(){ 
    gl_Position = a_position; 
    v_color = (a_position[0]*a_position[0]+a_position[1]*position[1]<RADIUS*RADIUS) ? RED : WHITE; 
} 

它不工作,因爲我想。爲什麼?

+0

因爲這種顏色的計算應該是片段着色器,而不是頂點一個。頂點着色器可以重新對齊頂點,但無論您嘗試多麼艱難 - 您都無法從四個頂點創建幾何圓。 – keltar

+1

[這可能會有幫助](http://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html) – gman

回答

1

總之:不是這樣的!

顧名思義,在頂點着色器代碼每頂點執行一次。所以如果你繪製一個正方形,那麼頂點着色器只會爲你爲繪製調用指定的4個頂點執行。

您在着色器代碼中的表達式需要爲每個片段執行(至少對於本次討論,您可以假定片段與像素相同)。您想要評估每個像素是否位於圓圈內部或外部。因此,邏輯需要位於片段着色器中。

爲了達到這個效果,最簡單的方法是將原始位置傳遞給片段着色器。片段着色器中可用的位置有一個內置變量(gl_FragCoord),但它是以像素爲單位的,這使得計算更加複雜。

所以,你的頂點着色器應該是這樣的:

attribute vec2 a_position; 
varying vec2 v_origPosition; 
... 
void main() { 
    gl_Position = a_position; 
    v_origPosition = a_position; 
} 

你們中的大多數在頂點着色器有什麼然後進入片段着色器:

... 
varying vec2 v_origPosition; 
... 
void main() { 
    gl_FragColor = (dot(v_origPosition, v_origPosition) < RADIUS * RADIUS) ? ... 
+0

你的答案幫了我,謝謝。 我想知道,儘管頂點着色器在每個頂點執行一次,但命令是「v_origPosition = a_position;」每個頂點(或片段)執行一次。 – DMaster

+0

該值在頂點着色器中每個頂點分配一次。然後在頂點着色器之後由固定功能塊對變量變量進行插值,並且將插值後的值進入片段着色器,如預期的那樣,每個片段(像素)調用一次。 –