次のような基本的なシェーダー プログラムにすぎないデフォルトのシェーダーをコンパイルするために、クロスプラットフォーム シェーダーを取得しようとしています。
頂点プログラム:
void main()
{
//vec4 vertex = matModelView * a_vertex;
gl_Position = ftransform();//matProj * vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
フラグメント プログラム:
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, gl_TexCoord[0].st);
}
gl_ プレフィックスが非推奨の関数であることは認識していますが、これは単なるデフォルトのシェーダーであるため、すべてが機能することがわかっています。このサンプルは、ウィンドウの下で私のシェーダー クラスで正常に動作します。
次に、シェーダー クラスについて説明します。シェーダー オブジェクトを作成するときに、ファイル拡張子のないパスを取る load メソッドを呼び出します。例: ./data/shaders/default ローダーはこれを受け取り、その文字列 + .vert .geom または .frag で適切なシェーダー プログラムを検索します。次に、これらがロードされ、プログラム作成の OpenGL 部分に渡されます。ここで問題が発生しているように見えます。シェーダー プログラムのコンテンツがディスクから正しく読み込まれていることを確認できるので、私が確認できる限り、ここに問題があるわけではありません。
ファイルがロードされると、頂点プログラムとフラグメント プログラム (またはジオメトリですが、これはオプションです) のコンパイルに進みます。
a_Type
またはのいずれGL_FRAGMENT_SHADER
かGL_VERTEX_SHADER
です。a_Source
シェーダー プログラム ファイル (.vert/.frag/.geom ファイル) の内容です。頂点プログラムをロードすると、コンパイルが即座に失敗し、if( success != GL_TRUE )
ヒットしてそうであると評価され、コンパイル エラーが発生します。「シェーダーコンパイル出力」printfは、コンパイルに関する情報を出力しません。(これOGLCHECK
は、opengl エラー スタックをチェックするマクロですが、これも何も表示されません。)
GLuint Shader::Compile(const GLuint a_Type, const char* a_Source)
{
if(a_Source == NULL)
return 0;
GLuint handle = glCreateShader(a_Type); OGLCHECK
glShaderSource(handle, 1, &a_Source, NULL); OGLCHECK
glCompileShader(handle); OGLCHECK
int bufflen = 0;
GLint success = GL_FALSE;
glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &bufflen); OGLCHECK
if(bufflen > 1)
{
GLchar* logString = new GLchar[bufflen + 1];
glGetShaderInfoLog(handle, bufflen, 0, logString); OGLCHECK
printf( "Shader compile output:\n%s\n", logString );
delete logString;
logString = 0;
}
glGetShaderiv(handle, GL_COMPILE_STATUS, &success); OGLCHECK
if(success != GL_TRUE)
{
printf( "Failed to compile shader!\n" );
glDeleteShader(handle); OGLCHECK
handle = 0;
}
return handle;
}
何が起こっているのかわかりませんが、これは Linux に移植した私のレンダリング エンジンの一部であるため、この実装は Windows で問題なく動作します。Linux でのシェーダーのコンパイルに関して同様の問題が発生した人はいますか?
また、glxinfo を確認しました。ここにいくつかの情報があります。
glxinfo | grep "OpenGL version"
OpenGL version string: 4.2.0 NVIDIA 295.49
また、fragment_program、vertex_program、geometry_program を grep しましたが、これらすべての拡張機能が利用できるようです。Ubuntu 12.04 を実行しています。
更新:シェーダーファイルとは無関係のようですが、ターミナルから実行すると、シェーダーをコンパイルして使用しますが、Code::Blocks から実行するたびに、シェーダーのコンパイルに失敗します..ロードされ、OpenGL に渡されます。何が起こっているのかわかりません。