2017-04-08 7 views
1

私はc++openGLを今学び、MacBookXcodeで動作させています。私はこのコードを持っています:OpenGL on Xcode8.2.1 - ウィンドウに頂点が表示されませんでした

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <stdio.h> 

int main() 
{ 
    GLFWwindow* window = NULL; 
    const GLubyte* renderer; 
    const GLubyte* version; 

    if (!glfwInit()) { 
     fprintf (stderr, "ERROR: could not start GLFW3\n"); 
     return 1; 
    } 

    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    window = glfwCreateWindow (640, 480, "OpenGL", NULL, NULL); 
    if (!window) { 
     fprintf (stderr, "ERROR: could not open window with GLFW3\n"); 
     glfwTerminate(); 
     return 1; 
    } 
    glfwMakeContextCurrent (window); 

    /* start GLEW extension handler */ 
    glewExperimental = GL_TRUE; 
    glewInit(); 

    glEnable (GL_DEPTH_TEST); 
    glDepthFunc (GL_LESS); 

    GLfloat vertices[] = { 
     0.5f, 0.5f, 0.0f, // Top Right 
     0.5f, -0.5f, 0.0f, // Bottom Right 
     -0.5f, -0.5f, 0.0f, // Bottom Left 
     -0.5f, 0.5f, 0.0f // Top Left 
    }; 
    GLuint indices[] = { // Note that we start from 0! 
     0, 1, 3, // First Triangle 
     1, 2, 3 // Second Triangle 
    }; 
    GLuint VBO, VAO, EBO; 
    glGenVertexArrays(1, &VAO); 
    glGenBuffers(1, &VBO); 
    glGenBuffers(1, &EBO); 

    glBindVertexArray(VAO); 

    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

    while (!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glBindVertexArray(VAO); 
     glDrawArrays(GL_TRIANGLES, 0, 6); 
//  glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
     glBindVertexArray(0); 

     glfwSwapBuffers(window); 
    } 

    glDeleteVertexArrays(1, &VAO); 
    glDeleteBuffers(1, &VBO); 
    glDeleteBuffers(1, &EBO); 

    glfwTerminate(); 
    return 0; 
} 

ウィンドウはエラーなしで開くことができましたが、シーンに描かれたクワッドやトライアングルはありませんでした。私は試してみました:の前には試しましたが、まだ何もありません。

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

何が働いていないようですか?私はprintf以下を使用しています:

どうすれば解決できますか?

Update01

私はシェーダとバージョンがあります:

#include <iostream> 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <stdio.h> 

const GLchar* vertexShaderSource = "#version 330 core\n" 
"layout (location = 0) in vec3 position;\n" 
"void main()\n" 
"{\n" 
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n" 
"}\0"; 
const GLchar* fragmentShaderSource = "#version 330 core\n" 
"out vec4 color;\n" 
"void main()\n" 
"{\n" 
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" 
"}\n\0"; 

int main() 
{ 
    GLFWwindow* window = NULL; 
    const GLubyte* renderer; 
    const GLubyte* version; 

    if (!glfwInit()) { 
     fprintf (stderr, "ERROR: could not start GLFW3\n"); 
     return 1; 
    } 

    glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    window = glfwCreateWindow (640, 480, "OpenGL", NULL, NULL); 
    if (!window) { 
     fprintf (stderr, "ERROR: could not open window with GLFW3\n"); 
     glfwTerminate(); 
     return 1; 
    } 
    glfwMakeContextCurrent (window); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

    glEnable (GL_DEPTH_TEST); 
    glDepthFunc (GL_LESS); 

    // Build and compile our shader program 
    // Vertex shader 
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); 
    glCompileShader(vertexShader); 
    // Check for compile time errors 
    GLint success; 
    GLchar infoLog[512]; 
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); 
    if (!success) 
    { 
     glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; 
    } 
    // Fragment shader 
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); 
    glCompileShader(fragmentShader); 
    // Check for compile time errors 
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); 
    if (!success) 
    { 
     glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; 
    } 
    // Link shaders 
    GLuint shaderProgram = glCreateProgram(); 
    glAttachShader(shaderProgram, vertexShader); 
    glAttachShader(shaderProgram, fragmentShader); 
    glLinkProgram(shaderProgram); 
    // Check for linking errors 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); 
    if (!success) { 
     glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; 
    } 
    glDeleteShader(vertexShader); 
    glDeleteShader(fragmentShader); 

    GLfloat vertices[] = { 
     0.5f, 0.5f, 0.0f, // Top Right 
     0.5f, -0.5f, 0.0f, // Bottom Right 
     -0.5f, -0.5f, 0.0f, // Bottom Left 
     -0.5f, 0.5f, 0.0f // Top Left 
    }; 
    GLuint indices[] = { // Note that we start from 0! 
     0, 1, 3, // First Triangle 
     1, 2, 3 // Second Triangle 
    }; 
    GLuint VBO, VAO, EBO; 
    glGenVertexArrays(1, &VAO); 
    glGenBuffers(1, &VBO); 
    glGenBuffers(1, &EBO); 

    glBindVertexArray(VAO); 

    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindVertexArray(0); 

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
    while (!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT); 

     // Draw our first triangle 
     glUseProgram(shaderProgram); 
     glBindVertexArray(VAO); 
//  glDrawArrays(GL_TRIANGLES, 0, 6); 
     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
     glBindVertexArray(0); 

     // Swap the screen buffers 
     glfwSwapBuffers(window); 
    } 

    glDeleteVertexArrays(1, &VAO); 
    glDeleteBuffers(1, &VBO); 
    glDeleteBuffers(1, &EBO); 

    glfwTerminate(); 
    return 0; 
} 

私はまだすべてのエラーを取得していないとクワッドがまだ表示されないし。

+1

シェーダーはどこですか? – BDL

+0

@BDL更新を確認してください。ありがとう! – sooon

答えて

0

私はこの問題を発見しました。

それはラインです:

glEnable (GL_DEPTH_TEST); 

クワッドが表示されていないします。私はその行をコメントし、すべてが大丈夫になる。

+2

実際の問題は、デプスバッファが有効になっていてもクリアしていないことです。 – BDL

+0

私はそれを受け入れるために答えとしてあなたのコメントをすることができますか? – sooon

関連する問題