0

私は、著者がそれが機能すると言っているインターネットの例を使用していますが、それは私には合法に見えます.

そこで、SDL2 をダウンロードし、フレームワークをデバッグでビルドしました。通常の Opengl 2.1 アプリを作成して、SDL が適切にビルドされ、デバッグできることを確認します。

次に、OpenGL 3.2 コア コンテキストを作成します。メジャー バージョンが 3 で、マイナー バージョンが 2 であることを確認しました ( GlGetIntegerv を呼び出します)。

私もこの行を使用しました:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

そして、固定パイプライン呼び出しが役に立たないことを再確認します。ここまでは順調ですね。

問題は、glsl 1.50 のシェーダーを使用しようとしたときです。コンパイルに失敗し、次のようなエラーが発生します (申し訳ありませんが、今のところエラーはありません): ERROR 0:2 syntax error syntax error

シェーダーのロード コードは次のようになります。

char* filetobuf(char *file)
{
    FILE *fptr;
    long length;
    char *buf;

    fptr = fopen(file, "rb"); /* Open file for reading */
    if (!fptr) /* Return NULL on failure */
        return NULL;
    fseek(fptr, 0, SEEK_END); /* Seek to the end of the file */
    length = ftell(fptr); /* Find out how many bytes into the file we are */
    buf = (char*)malloc(length+1); /* Allocate a buffer for the entire length of the file and a null terminator */
    fseek(fptr, 0, SEEK_SET); /* Go back to the beginning of the file */
    fread(buf, length, 1, fptr); /* Read the contents of the file in to the buffer */
    fclose(fptr); /* Close the file */
    buf[length] = 0; /* Null terminator */

    return buf; /* Return the buffer */
}

およびシェーダー:

vertex shader
#version 150 core
 
uniform mat4 viewMatrix, projMatrix;
 
in vec4 position;
in vec3 color;
 
out vec3 Color;
 
void main()
{
    Color = color;
    gl_Position = projMatrix * viewMatrix * position ;
}

fragment shader:
#version 150 core
 
in vec3 Color;
out vec4 outputF;
 
void main()
{
    outputF = vec4(Color,1.0);
}

3.2 コア コンテキストを使用しないと、「バージョンがサポートされていません」というメッセージが表示されます。しかし、今ではないので、エラーは別のものに違いありません。

どんな手掛かり?

更新 確かに、const char * を作成し、シェーダー全体を書き込み、glShaderSource() への参照を渡したので、シェーダー ファイルの読み取りで何か問題が発生しました。面白いことに、まだ filetobuf() の何が問題なのかわかりません (Armin の修正を適用しました)。

4

1 に答える 1

0

fread()の使い方が間違っています。

それ以外の

fread(buf, length, 1, fptr); 

そのはず

fread(buf, 1, length, fptr); 

読み取り関数にエラーがないことがわかる限り、これは問題ではないかもしれませんが、意図したとおりにライブラリ関数を使用することをお勧めします。

ただし、コードの2番目の部分についてはわかりません。より説明的なエラー メッセージを投稿すると役立ちます。

于 2013-07-04T11:27:46.940 に答える