2016-07-24 2 views
-1

지금 저는 OpenGL을 배우고 있습니다. 나는 OpenGL Superbible이라는 책을 샀다. 하지만 제대로 환경을 구성 할 수 없었습니다. 나는 GLFW 3.2를 윈도우 툴킷 (그것이 무엇인지 불리우면)과 GLEW 2.0으로 사용합니다.glCreateVertexArrays를 사용할 때 검은 화면이 나타납니다.

화면에 그릴 때 셰이더를 컴파일하고 사용하려고합니다. 책에 따르면 이것은 화면에 삼각형을 그려야합니다. 그러나 그렇지 않습니다. 대신, glClearColor에 의해 설정된 명확한 배경색을 보여줍니다. 난 비주얼 스튜디오 2015에서 작업하고

#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; 
} 

좀 OpenGL은을 (내가 생각하는) 개발에 모든 라이브러리를 가지고 있지만, somethig에 잘못된 것입니다 :

Code입니다. 도와주세요. 그건 그렇고, glCreateVertexArrays() 함수는 OpenGL 4.5 이상에서만 사용 가능합니다.이 책은 OpenGL 4.5에서 설명 되었기 때문에 알고 있습니다.

초보자를위한 적절한 튜토리얼이 없기 때문에 곧 갈 것입니다. 이것을 배운 사람들은 매우 야심 찬 사람들입니다. 나는 그 사람들 앞에 굴복한다.

+0

'glDrawArrays' 바로 전에'glGetError()'를 호출하고'GL_NO_ERROR' 이외의 것을 반환하는지 확인하십시오. – SurvivalMachine

+0

코드에서 그릴 데이터가 없습니다. 그리려는 정점이 포함 된 버퍼를 만들어야합니다. 그리고이 버퍼는'glEnableVertexAttribArray'와'glVertexAttribPointer'를 사용하여 VertexArrayObject에 할당해야합니다. [open.gl : 다각형 그리기] (https://open.gl/drawing) –

+0

@ t.niese 흠. 그러나이 책에서는 그 추가적인 것을 말하지 않습니다. @ SurvivalMachine'glGetError()'가 0을 반환했습니다. – Bora

답변

2

쉐이더 컴파일되지해야합니다

glShaderSource(VertexShader, 1, VertexShaderSource, NULL); 

이 그것을 1 GLchar 포인터의 배열을 기대해야한다는 GL을 알려줍니다. 그러나 GLSL 코드는 실제로 여러 개의 개별 문자열로 나뉩니다 (쉼표 참고). 배열은 하나의 문자열로 전체 GLSL 소스를 가리키는 하나 개의 요소로 포함되도록

  1. 그냥 그 쉼표를 제거합니다

    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. 는 데이터에 대해 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

관련 문제