2011-12-22 38 views
1

我有一個OSG應用程序,我想紋理映射finalDrawCallback中的全屏四元組,因爲我需要在完成紋理之前渲染場景中的所有內容。這就是爲什麼我必須使用openGL調用而不是osg調用程序和着色器來執行。在osg應用程序中編譯着色器源代碼

具體來說,我似乎遇到了編譯vert和frag着色器的問題。當我打電話給glGetShaderiv(shader, GL_COMPILE_STATUS, &param),我的參數值不會改變或不確定。根據其documentation表示發生錯誤。但是,當我打電話給glGetError()查看時,openGL報告GL_NO_ERROR

下面是設置功能

glActiveTexture(GL_TEXTURE0); 
    glGenTextures(1, &screenTexture); 
    glBindTexture(GL_TEXTURE_2D, screenTexture); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

    GLuint vs = glCreateShader(GL_VERTEX_SHADER); 
    const GLchar* vs_source = shaderLoadFile("vert.glsl"); 

    glShaderSource(vs, 1, &vs_source, NULL); 
    glCompileShader(vs); 
    checkShader(vs); 

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); 
    const GLchar* fs_source = shaderLoadFile("frag.glsl"); 

    glShaderSource(fs, 1, &fs_source, NULL); 
    glCompileShader(fs); 
    checkShader(fs); 

    prog = glCreateProgram(); 
    glAttachShader(prog, vs); 
    glAttachShader(prog, fs); 

    glLinkProgram(prog); 
    glUseProgram(prog); 

和輔助函數來讀取着色代碼:

FILE *f = fopen(file, "rb"); 
if (f == NULL) 
{ 
    std::cout<<"Error: Unable to locate shader files.\n"; 
    exit(-1); 
    return NULL; 
} 

fseek(f, 0, SEEK_END); 
long size = ftell(f); 
fseek(f, 0, SEEK_SET); 
char* ret = new char[size+1]; 
fread(ret, size, 1, f); 
fclose(f); 
ret[size] = '\0'; 
return ret; 

而且着色器本身

//vertex shader 
void main() 
{ 
    glTexCoord[0] = gl_MultiTexCoord0; 
} 
    //frag shader 
uniform sampler2D screenTex; 
void main() 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 

編輯:我只是想通了這一點。看起來問題在於我在進行這些調用時沒有圖形上下文。

+0

着色器是否獨立編譯? – genpfault

+0

他們是單獨的文件,很抱歉我的格式在我的文章中很差。他們不會自行編譯。除非你的意思是別的? – Fajak

+0

我的意思是在OSG之外。 – genpfault

回答

1

看來問題在於我在進行這些調用時沒有圖形上下文。我相信這解釋了沒有錯誤產生的原因,但着色器編譯失敗。

相關問題