2011-12-22 10 views
1

私は、テクスチャ処理が行われる前にシーン内のすべてをレンダリングする必要があるため、finalDrawCallbackに全画面クワッドをテクスチャマッピングするOSGアプリケーションがあります。このため、プログラムとシェーダの実行にosgコールの代わりにopenGL呼び出しを使用する必要があります。osgアプリケーション内でシェーダソースをコンパイルする際の問題

特に、私はvertシェーダとfragシェーダの両方のコンパイルに問題があるようです。私がglGetShaderiv(shader, GL_COMPILE_STATUS, &paramと呼ぶとき)、私の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

これらの呼び出しを行うときにグラフィックスのコンテキストがないことが問題だったようです。私はこれがエラーが発生していない理由を説明していると信じていますが、シェーダはコンパイルに失敗しました。

関連する問題