2016-07-24 14 views
-1

私は今openglを学んでいます。私はOpenGL Superbibleという本を買った。しかし、私は環境を正しく構成するために生き残ることができませんでした。私は、GLFW 3.2をウィンドウツールキット(それが呼び出されている場合)とGLEW 2.0として使用します。glCreateVertexArraysを使用しているときに黒い画面が表示される

私はスクリーンに描画するためにシェーダをコンパイルして使用しようとしています。本によると、これは画面上に三角形を描くはずです。しかし、それはしません。代わりに、glClearColorで設定されている透明な背景色が表示されます。

これはCodeです:

#include <iostream> 

#include <GLFW\glfw3.h> 
#include <GL\glew.h> 

GLuint CompileShaders(); 

int main(void) { 
    // Initialise GLFW 
    if (!glfwInit()) { 
    fprintf(stderr, "Failed to initialize GLFW\n"); 
    getchar(); 
    return -1; 
    } 

    // Open a window and create its OpenGL context 
    GLFWwindow *window; 
    window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL); 
    if (window == NULL) { 
    fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, " 
        "they are not 3.3 compatible. Try the 2.1 version of the " 
        "tutorials.\n"); 
    getchar(); 
    glfwTerminate(); 
    return -1; 
    } 
    glfwMakeContextCurrent(window); 

    // Initialize GLEW 
    if (glewInit() != GLEW_OK) { 
    fprintf(stderr, "Failed to initialize GLEW\n"); 
    getchar(); 
    glfwTerminate(); 
    return -1; 
    } 

    // Ensure we can capture the escape key being pressed below 
    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); 

    GLuint RederingProgram = CompileShaders(); 
    GLuint VertexArrayObject; 
    glCreateVertexArrays(1, &VertexArrayObject); 
    glBindVertexArray(VertexArrayObject); 

    int LoopCounter = 0; 

    do { 
    // Clear the screen. It's not mentioned before Tutorial 02, but it can cause 
    // flickering, so it's there nonetheless. 
    /*const GLfloat red[] = { 
      (float)sin(LoopCounter++/100.0f)*0.5f + 0.5f, 
      (float)cos(LoopCounter++/100.0f)*0.5f + 0.5f, 
      0.0f, 1.0f 
    };*/ 
    // glClearBufferfv(GL_COLOR, 0, red); 

    // Draw nothing, see you in tutorial 2 ! 
    glUseProgram(RederingProgram); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 

    // Swap buffers 
    glfwSwapBuffers(window); 
    glfwPollEvents(); 

    } // Check if the ESC key was pressed or the window was closed 
    while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && 
     glfwWindowShouldClose(window) == 0); 

    // Close OpenGL window and terminate GLFW 
    glfwTerminate(); 

    return 0; 
} 

GLuint CompileShaders() { 
    GLuint VertexShader; 
    GLuint FragmentShader; 
    GLuint Program; 

    static const GLchar *VertexShaderSource[] = { 
     "#version 450 core      " 
     " " 
     "\n", 
     "         " 
     "  \n", 
     "void main(void)       " 
     " " 
     "\n", 
     "{        " 
     " " 
     "  \n", 
     "const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),\n", 
     "         " 
     "vec4(-0.25, -0.25, 0.5, 1.0),\n", 
     "         " 
     "vec4(0.25, 0.25, 0.5, 1.0)); \n", 
     " gl_Position = vertices[gl_VertexID]; \n", 
     "}        " 
     " " 
     "  \n"}; 

    static const GLchar *FragmentShaderSource[] = { 
     "#version 450 core      " 
     " " 
     "\n", 
     "         " 
     "  \n", 
     "out vec4 color;       \n", 
     "         " 
     "  \n", 
     "void main(void)       " 
     " " 
     "\n", 
     "{        " 
     " " 
     "  \n", 
     " color = vec4(0.0, 0.8, 1.0, 1.0);  \n", 
     "}        " 
     " " 
     "  \n"}; 

    // Create and compile vertex shader. 
    VertexShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(VertexShader, 1, VertexShaderSource, NULL); 
    glCompileShader(VertexShader); 

    // Create and compile fragment shader. 
    FragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(FragmentShader, 1, FragmentShaderSource, NULL); 
    glCompileShader(FragmentShader); 

    // Create program, attach shaders to it, and link it 
    Program = glCreateProgram(); 
    glAttachShader(Program, VertexShader); 
    glAttachShader(Program, FragmentShader); 
    glLinkProgram(Program); 

    // Delete the shaders as the program has them now. 
    glDeleteShader(FragmentShader); 
    glDeleteShader(VertexShader); 

    return Program; 
} 

私は、Visual Studio 2015で働いています私は(私が思う)、いくつかのOpenGLを開発するすべてのライブラリを持っていますが、somethigは間違っています。私を助けてください。ちなみに、glCreateVertexArrays()の機能はOpenGL 4.5以降でしかないと私は知っています。この本はOpenGL 4.5で説明されています。

初心者のための適切なチュートリアルがないので、私はすぐにクレイジーに行きます。これを学んだ人は非常に野心的な人々です。私はそれらの人々の前に弓をする。

+0

'glDrawArrays'の直前で' glGetError() 'を呼び出し、' GL_NO_ERROR'以外の何かを返すかどうか確認してください。 – SurvivalMachine

+0

あなたのコードでは描画するデータがありません。描画する頂点を含むバッファを作成する必要があります。そして、このバッファは 'glEnableVertexAttribArray'と' glVertexAttribPointer'を使ってVertexArrayObjectに_assign_する必要があります。 [open.gl:Drawing polygons](https://open.gl/drawing) –

+0

@ t.niese Hmmをご覧ください。しかし、本書では、それらの追加の事柄については言及していません。 @ SurvivalMachine 'glGetError()'はゼロを返しました。 – Bora

答えて

2

あなたのシェーダがコンパイルされないはずです。

glShaderSource(VertexShader, 1, VertexShaderSource, NULL); 

をこれは、 GLcharポインタの配列を期待するべきであるとGLを伝えます。しかし、あなたのGLSLコードは実際にはいくつかの個々の文字列に分割されます(コンマに注意してください)。

static const GLchar *VertexShaderSource[] = { 
    "...GLSL-code..." 
    "...GLSL-code..." 
    "...GLSL-code...", // <- this comma ends the first string vertexShaderSource[0] 
    "...GLSL-code..." // vertexShaderSource[1] starts here 
    [...] 

2つの解決策があります:あなたの配列が1つの文字列として全体のGLSLソースを指しているだけに1つの要素を含むように

  1. だけで、これらのカンマを削除します。
  2. は、あなたのデータについてGLに真実を教える:

glShaderSoure(..., sizeof(vertexShaderSource)/sizeof(vertexShaderSource[0]), vertexShaderSource, ,,,) 
は、それとは別に、あなたは常にあなたのシェーダとプログラム・オブジェクトのコンパイルとリンク状態を照会する必要があります。また、シェーダのコンパイルとプログラムのリンク情報ログを照会します。それらにはコンパイル/リンクが失敗した理由を説明する人間の読書メッセージが含まれます。

+0

本当にコンマがあったからです。これらのことをどのように照会するかについて私に正しい方向を教えてください。あなたが私のC++が少し弱いことが分かるので、私はカンマも忘れてしまった。私は少し身近なですが、私のために学ぶべきことがたくさんあります。 – Bora

+0

私は物事のC + +側については言及していませんでしたが、GLのシェーダコンパイラとリンカです。 [OpenGL wikiのこの例](https://www.opengl.org/wiki/Shader_Compilation#Example)を見てください。 – derhass