2011-11-18 24 views
0

我試圖編譯我在OpenGLES 2.0着色器:glGetShaderiv回報率大於1的值

/* Try compiling the shader. */ 
GL_CHECK(glCompileShader(*pShader)); 
GL_CHECK(glGetShaderiv(*pShader, GL_COMPILE_STATUS, &iStatus)); 

glGetShaderiv返回iStatus大於1,當我嘗試獲取登錄信息,我得到空字符串:

if (iStatus > 1) 
{ 
    GLsizei slen = 0; 
    GLchar* compiler_log = (GLchar*)malloc(iStatus); 
    glGetShaderInfoLog(*pShader, iStatus, &slen, compiler_log); 
    cout <<"compiler_log:\n"<<compiler_log<<endl; 
    free (compiler_log); 
} 

着色器:

attribute vec4 av4position; 
attribute vec3 av3colour; 
attribute vec2 av2texture; 

uniform mat4 mvp; 

varying vec3 vv3colour; 
varying vec2 vv2texture; 

void main() 
{ 
    // Pass the texture coordinate attribute to a varying. 
    vv2texture = av2texture; 
    // Pass the color value to a varying. 
    vv3colour = av3colour; 
    gl_Position = mvp * av4position; 
} 

是否有人有任何想法,爲什麼?

+0

你剛剛在解決這個問題後就放棄了這個問題,或者你對已發佈的答案有任何疑問? –

+0

我剛剛解決了它,我將重新格式化我的問題,並在下班後添加答案。 –

+0

仍在等待該解決方案,與已有的現有答案不同。 –

回答

1

glGetShaderiv沒有返回值大於1,它不返回任何東西(變量未初始化)。

它不返回任何東西的原因是,有沒有安裝的軟件包:

libglapi檯面 填實libgl1檯面-GLX 填實libgl1 - 檯面 - DRI

其不可在Ubuntu 11.04 ,只在Ubuntu 11.10上。所以我無法找到11.04的解決方案,我剛剛升級到11.10。

1

GL_COMPILE_STATUS返回的值與信息日誌的長度不一致。如果着色器編譯成功或沒有成功,它只是一個指標,所以它實際上應該是GL_TRUEGL_FALSE。但是我認爲大於1的值可以算作成功(因爲你的着色器看起來完全合理),因此無論如何都不需要獲取信息日誌,這在編譯成功的情況下可能只是一個空字符串。

要獲取信息記錄的長度,呼叫

glGetShaderiv(*pShader, GL_INFO_LOG_LENGTH, &iLength) 

,並使用該值分配和查詢信息的日誌。所以,你的代碼應該是這個樣子:

if (iStatus == GL_FALSE) 
{ 
    GLsizei iLength, slen = 0; 
    glGetShaderiv(*pShader, GL_INFO_LOG_LENGTH, &iLength); 
    GLchar* compiler_log = new GLchar[iLength]; 
    glGetShaderInfoLog(*pShader, iLength, &slen, compiler_log); 
    cout << "compiler_log:\n" << compiler_log << endl; 
    delete[] compiler_log; 
} 
0

根據文檔,如果生成錯誤,則不會更改參數的值(glGetShaderiv的最後一個參數)。

爲了更好地調試問題,請在着色器編譯之前使用glGetError()。