3

Mac OS X Lionを実行していて、基本的なOpenGlプログラムを作成しようとしていますが、フラグメントシェーダーが機能していません。含めない場合は黒い三角形になりますが、含めた場合は画面が真っ白になります。また、ロード中にエラーは発生しません。これをデバッグするための最良の方法は何ですか?これが私のシェーダーです:

バーテックス:

#version 120
attribute vec2 coord2d;
void main(void) {
    gl_Position = vec4(coord2d, 0.0, 1.0);
}

断片:

#version 120
void main(void) {
    gl_FragColor[0] = 1.0;
    gl_FragColor[1] = 1.0;
    gl_FragColor[2] = 0.0;
}

そして、このチュートリアルから得たシェーダーをロードするためのコード。

より多くの情報を追加するために編集

int init_resources()
{
    GLfloat triangle_vertices[] = {
        0.0f,  0.8f,
        -0.8f, -0.8f,
        0.8f, -0.8f,
    };
    glGenBuffers(1, &vbo_triangle);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW);

    GLint link_ok = GL_FALSE;
    GLuint vs, fs;
    if ((vs = create_shader("vertShader.sh", GL_VERTEX_SHADER))   == 0) return 0;
    if ((fs = create_shader("fragShader.sh", GL_FRAGMENT_SHADER)) == 0) return 0;

    program = glCreateProgram();
    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);
    glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
    if (!link_ok) {
        fprintf(stderr, "glLinkProgram:");
        print_log(program);
        return 0;
    }

    const char* attribute_name = "coord2d";
    attribute_coord2d = glGetAttribLocation(program, attribute_name);
    if (attribute_coord2d == -1) {
        fprintf(stderr, "Could not bind attribute %s\n", attribute_name);
        return 0;
    }

    return 1;
}

void onDisplay()
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glUseProgram(program);
    glEnableVertexAttribArray(attribute_coord2d);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
    glVertexAttribPointer(
                          attribute_coord2d, 
                          2,                 
                          GL_FLOAT,          
                          GL_FALSE,          
                          0,                 
                          0                  
                          );

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(attribute_coord2d);
    glutSwapBuffers();
}

GLuint create_shader(const char* filename, GLenum type)
{
  const GLchar* source = file_read(filename);
  if (source == NULL) {
    fprintf(stderr, "Error opening %s: ", filename); perror("");
    return 0;
  }
  GLuint res = glCreateShader(type);

  glShaderSource(res, 1, source, NULL);
  free((void*)source);

  glCompileShader(res);
  GLint compile_ok = GL_FALSE;
  glGetShaderiv(res, GL_COMPILE_STATUS, &compile_ok);
  if (compile_ok == GL_FALSE) {
    fprintf(stderr, "%s:", filename);
    print_log(res);
    glDeleteShader(res);
    return 0;
  }

  return res;
}
4

2 に答える 2

2

その間、あなたはあなたの解決策を見つけたようですが、私はあなたに別のヒントを与えたいと思いました。

「XCode用のグラフィックツール」(開発者のダウンロードセクションから入手可能)をインストールすることをお勧めします。これは、特にシェーダーの開発に大いに役立ちます。

  • シェーダーの開発とテストに役立つOpenGLシェーダービルダー

  • OpenGL Profilerは、アプリケーションのプロファイリングに役立つだけでなく、ロードされているリソースなどを確認することもできます。ブレークポイントを設定して実行を停止し(たとえば、スワップする前に)、ロードされているシェーダーを表示できます。実行時に変更して、変更がどのような影響を与えるかを確認します

OpenGLプロファイラーのユーザーガイドは次のとおりです 。https ://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGLProfilerUserGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006475-CH1- DontLinkElementID_31

お役に立てば幸い

于 2012-05-30T09:58:36.200 に答える
2

gl_FragColor [3]=1.0を追加する必要がありました。不透明度を設定していなかったので。

于 2012-05-30T03:48:41.787 に答える