2012-08-24 69 views
6

對不起,我會重寫希望清楚的問題。GLSL Fragment Position

在我的.cpp代碼中,我創建了一個四方形列表,其中一些有一個標誌,在像素着色器中,我檢查該標誌是否設置,如果沒有設置標誌,紅色,例如,如果設置了標誌,我想決定每一個像素的顏色,所以如果我需要爲紅色標記的四分之一的顏色着色,而另一半藍色,我可以簡單地做這樣的事情:

if coordinate in quad < something color = red 
else colour = blue; 

通過這種方式,我可以得到四分之一色的藍色和另一半紅色的顏色,或者我可以決定在哪裏放置紅色或放置藍色的位置。

想象我有四50x50像素

[FRAG]

if(quad.flag == 1) 
    {  
    if(Pixel_coordinate.x<25) gl_fragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    else gl_fragColor = vec4(0.0, 1.0, 0.0, 1.0); 
    } 
else 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 

在這種情況下,我會期望與標誌設置四會得到每個面兩種顏色。 我希望我現在已經更具體。

感謝。

只是添加一些東西,我不能使用任何紋理。

好吧,我現在這樣做:

每四有4個紋理協調(0,0),(0,1),(1,1),(1,0);

啓用紋理座標使用:

glTexCoordPointer(2, GL_SHORT, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 7)); 

[VERT]

varying vec2 texCoord; 

main() 
{ 
    texCoord = gl_MultiTexCoord0.xy; 
} 

[FRAG]

varying vec2 texCoord; 

main() 
{ 
    float x1 = texCoord.s; 
    float x2 = texCoord.t; 

    gl_FragColor = vec4(x1, x2, 0.0, 1.0); 
} 

我總是得到黃色所以X1 = 1米x 2幾乎總是= 1,一些四邊形是黃色/綠色。

我期望紋理座標在片段着色器中發生變化,所以我應該得到一個漸變,我錯了嗎?

+0

要*「理解」*哪個位置(以及幾何的哪個*「半」*)?屏幕空間位置?世界空間的位置?觀看空間的位置?哪一個? –

+0

當地的位置是什麼,你是指四邊形在世界空間中的位置還是什麼?什麼意思*「將像素着色一半」*?這個標誌的使用是否對實際問題有任何意義(也就是說,你想根據*「瞭解位置」來動態計算這個標誌*)?我非常難以理解你真正想要達到的目標。 –

回答

4

如果您想知道四個座標中的座標,則需要自行計算。爲此,您需要創建一個新插補(稱爲vec2 quadCoord),併爲每個頂點適當地設置它,這意味着您可能還需要將其添加爲屬性並將其傳遞到頂點着色器。例如:

// in the vertex shader 
attribute vec2 quadCoordIn; 
varying vec2 quadCoord; 

main() { 
    quadCoord = quadCoordIn; 
       : 

繪製四邊形時,您需要在繪圖代碼中使用此屬性。對於每個四邊形,頂點可能具有(0,0),(0,1),(1,1)和(1,0)的quadCoordIn值 - 如果您願意,可以使用其他座標系,但這是最簡單的。

然後,在您的片段程序中,您可以訪問quadCoord.xy來確定您在四邊形中的位置。

+0

嗨克里斯,謝謝你的回答,只是另一件事,我認爲如果我沒有在我的cpp代碼中啓用紋理,紋理座標是恆定的,或者是0或1,我確實發現了這一點,因爲用紋理座標我只得到兩種顏色,這是否正確(我的意思是,我是否還需要啓用和綁定紋理,否則opengl不會在片段着色器中給我正確的紋理座標?) – user1583007

2

除了多德的回答,您還可以訪問的屏幕空間座標(以像素爲單位,但實際像素中心,並因此?.5)通過特殊的片段着色器變量gl_FragCoord當前處理的片段:

gl_FragColor = (gl_FragCoord.x<25.0) ? vec4(1.0, 0.0, 0.0, 1.0) : vec4(0.0, 1.0, 0.0, 1.0); 

但是,這給你的屏幕空間,因此相對於你的左下角視口的片段的位置。如果你真的需要知道單個四邊形內的位置(如果你想實際爲每個四分之一的半色彩着色,這是更有意義的,因爲「半切割」會隨着四邊形的位置而變化),然後Chris多德的答案是正確的做法。

+0

嗨,Christian,謝謝你的回答,你是對,我需要訪問每個簡單的四邊形,所以gl_FragCoord不適用於我:( – user1583007