私は、テクスチャ処理が行われる前にシーン内のすべてをレンダリングする必要があるため、finalDrawCallbackに全画面クワッドをテクスチャマッピングするOSGアプリケーションがあります。このため、プログラムとシェーダの実行にosgコールの代わりにopenGL呼び出しを使用する必要があります。osgアプリケーション内でシェーダソースをコンパイルする際の問題
特に、私はvertシェーダとfragシェーダの両方のコンパイルに問題があるようです。私がglGetShaderiv(shader, GL_COMPILE_STATUS, ¶m
と呼ぶとき)、私の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);
}
編集を:私はちょうどこのアウトを考え出し。問題は、これらの呼び出しを行うときにグラフィックのコンテキストがないことだったようです。
シェーダは単独でコンパイルされますか? – genpfault
彼らは別々のファイルです、申し訳ありません私の書式で私のポストでは貧しいです。彼らは自分でコンパイルしません。あなたが何か他のことを意味しない限り? – Fajak
私はOSG以外を意味していました。 – genpfault