2011-09-07 91 views
1

我有一個非常簡單的着色器(只是將背景正方形設置爲綠色),並且完美地工作。
我最近添加了一些應用了紋理的四邊形。所以我用這個來稱呼它這個紋理有一定的alpha值:glBlendFunc禁用着色器

glEnable (GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textureID); 

    //draw quad 

    glDisable(GL_TEXTURE_2D); 
    glBlendFunc (GL_ONE, GL_ZERO); 
    glDisable (GL_BLEND); 
    glBindTexture(GL_TEXTURE_2D, 0); //remove texture 

的四顯示細膩與透明度 - 但在後臺着色器現在已經沒有了。它仍在繪製中,但沒有顯示。

現在我刪除了兩個glBlendFunc(...)行並着色器再次出現(但我失去了alpha混合)。 但是,每當我調用該函數時,着色器似乎都停止工作。

關於爲什麼會發生這種情況的任何想法?

圖像的glBlendFunc移除:
glBlendFunc

圖像的glBlendFunc使用:
glBlendFunc removed

着色器加載代碼:

//create shaders 
    vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 

    //grab the char so we can send it to gfx card 
    const char* vShadData = loadFile(vertexShaderFile); 
    const char* fShadData = loadFile(fragShaderFile); 

    //send data to gfx card 
    glShaderSource(vertexShader, 1, (const GLchar **)&vShadData, NULL); 
    glShaderSource(fragmentShader, 1, (const GLchar **)&fShadData, NULL); 

    //check if compiled 
    GLint compiled; 

    glCompileShader(vertexShader); 
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled); 
    if(compiled==FALSE) 
    { 
     //doesn't get here 
    } 
    glCompileShader(fragmentShader); 
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled); 
    if(compiled==FALSE) 
    { 
     //doesn't get here 
    } 

    //finally, create shader program 
    shaderProgram = glCreateProgram(); 

    //attach shaders to program 
    glAttachShader(shaderProgram, vertexShader); 
    glAttachShader(shaderProgram, fragmentShader); 

    glLinkProgram(shaderProgram); 

    GLint linkStatus; 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, (GLint *)&linkStatus); 
    if(linkStatus==FALSE) 
    { 
     //doesn't get here 
    } 

Vert的着色器(很簡單):

void main(void) 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

破片着色器:

void main(void) 
{ 
    gl_FragColor = vec4(0.0, 0.3, 0.0, 0.0); 
} 
+0

你可以展示一些圖片的外觀和外觀。這聽起來像是一個深度排序問題,但我不確定。 –

+0

添加的圖像。我已經重新安排了繪圖功能的順序(所以背景渲染的是最後一個,而不是第一個),但仍然沒有區別。此外,如果它意味着任何事情:着色器實際上是非常不同的,畫一些噪音,而不是一個純色。當我發現它沒有顯示時,我將它改爲繪製靜態綠色。 (如果不使用glBlendFunc,它仍然可以顯示噪聲圖像) – Andrew

+0

在使用glBlendFunc的版本中繪製背景時,是否確定着色器仍然處於啓用狀態? – neodelphi

回答

2

在你的片段着色器設置的顏色(0,0.3%,0,0),這是帶有alpha的0的深綠色。啓用混合並且標準glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) alpha主要表示顏色的不透明度,而0的不透明度表示完全透明的背景。

所以,只需將背景的alpha更改爲1,您應該再次看到它。

gl_FragColor = vec4(0.0, 0.3, 0.0, 1.0); 

但請記住先渲染你的背景,然後再讓其他形狀正確地融合到背景上。您可能也只是在渲染背景時禁用混合,並僅爲紋理對象啓用混合。但是,無論如何,使用1的alpha是從概念上說正確的方式來說,你的背景是完全不透明的。

+0

哦,現在。就在我面前。該死的這些小東西......完美的工作 - 但是我關掉GL_BLENDing並將glBlendFunc設置回原來的BEFORE繪製着色器 - 所以透明度應該不重要?應該是? (並且是,我首先繪製了我的背景) – Andrew

0

繪製一個四邊形的代碼是這樣的:

glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glBegin(GL_TRIANGLE_FAN); 
    glTexCoord2f(0.0f, 0.0f); 
    glVertex2f(-1.0f, 1.0f);  
    glTexCoord2f(1.0f, 0.0f); 
    glVertex2f(1.0f, 1.0f); 
    glTexCoord2f(1.0f, 1.0f); 
    glVertex2f(1.0f,-1.0f); 
    glTexCoord2f(0.0f, 1.0f); 
    glVertex2f(-1.0f,-1.0f); 
glEnd(); 
glDisable(GL_TEXTURE_2D); 
glBlendFunc (GL_ONE, GL_ZERO); 
glDisable (GL_BLEND); 
glBindTexture(GL_TEXTURE_2D, 0); //remove texture 

現在兩種着色器四和紋理四我使用相同的代碼。然而,我從來沒有爲shader quad加載紋理,所以我發送給opengl的textureID是-1。
將此代碼更改爲不綁定textureID(如果它的==爲-1),則着色器按其應用的方式工作,並且我仍然在紋理四邊形上獲得透明度。

但是Christian Rau的答案在我的代碼中發現了一個錯誤 - 這可能是失敗的主要原因。

+1

如果使用未從紋理讀取的着色器,則綁定或啓用txture無關緊要。同樣,如果您使用着色器進行紋理化,則不需要'glEnable(GL_TEXTURE_2D)'。 –