4

単一のフラグメントシェーダーで構成される単純なOpenGL3.2プログラムを作成しようとしていますが、実際にシェーダーをコンパイルできないようです。シェーダーの構文が正しいことはかなり確信していますが、正しくない場合でも、を使用してエラーメッセージを取得することはできませんglGetShaderInfoLog

私はこれが実際に行われていることを示す短いプログラムを開発しました。

GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);

const char *shaderData =
            "#version 120\n"
            "void main()\n"
            "{\n"
            "    gl_FragColor = gl_Color;\n"
            "}\n";
glShaderSource(shader, 1, &shaderData, NULL);

GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);

if (status == GL_FALSE)
{
    GLint infoLogLength;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);

    GLchar* strInfoLog = new GLchar[infoLogLength + 1];
    glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);

    fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog);
    delete[] strInfoLog;
}

これにより、次のメッセージが生成されます。

シェーダーフラグメントシェーダーのコンパイルエラー:

getShaderiv問題は、値を取得するための呼び出しがGL_INFO_LOG_LENGTH毎回0を返すことであると思われるため、空の文字列を割り当てます。この値を100にハードコーディングしようとしましたが、それでも。から何も受け取りませんgetShaderInfoLog

ここでの私の懸念は、シェーダーを修正することではなく(間違っている場合は自分で修正できます)、デバッグ情報を取得することです。Shader Makerを使用してシェーダーを簡単に開発したので、これが可能であり、非常に詳細なデバッグメッセージを取得できることを知っています。例えば:

ERROR: 0:11: 'undefined_variable' : syntax error syntax error

Shader Markerが内部に独自の検証ツールを持っていない限り、私が使用しようとしているのと同じ方法を使用する必要があると確信しています。インターネット上で、同じ方法でシェーダーのエラーメッセージを取得する例をいくつか見てきたので、正しく実行していると確信しています。

現在、この問題を説明できる可能性のあるコンパイル時の警告が表示されます。

#warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality.

全文検索を行った後、呼び出した場所が見つからないため、このヘッダーがクラス#include <OpenGL/gl.h>の1つに含まれていると推測されます。NSOpenGL*私はこの短いプログラムで削除された機能を使用していないことをかなり確信しています。この問題はGoogleで約5ヒットしかないのですが、とにかくこれについて言及したほうがいいと思いました。

4

1 に答える 1

11

前のコメントで述べたように、glCompileShader呼び出しが欠落していました。

于 2012-09-06T00:30:18.673 に答える