2017-11-03 16 views
3

私のコードは三角形を全く表示していません。ステップごとにデバッグしようとしましたが、運はありませんでした。私のコードで何が間違っていますか?C++ OpenGL三角形が描画されているか全く見えない

#include <gl/glew.h> 
#include <GLFW/glfw3.h> 
#include <iostream> 
static unsigned int CompileShader(unsigned int type, const std::string& source) 
{ 
    unsigned int id = glCreateShader(type); 
    const char* src = source.c_str(); 
    glShaderSource(id, 1, &src, nullptr); 
    glCompileShader(id); 

    int result; 
    glGetShaderiv(id, GL_COMPILE_STATUS, &result); 

    if (result == GL_FALSE) 
    { 
     int length; 
     glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); 
     char* message = (char*)alloca(length * sizeof(char)); 
     glGetShaderInfoLog(id, length, &length, message); 
     std::cout << "Failed to compile" << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader" << std::endl; 
     std::cout << message << std::endl; 
     glDeleteShader(id); 
     return 0; 
    } 
    return id; 
} 

static unsigned CreateShader(const std::string& vertexShader, const std::string& fragmentShader) 
{ 
    unsigned int program = glCreateProgram(); 
    unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader); 
    unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader); 

    glAttachShader(program, vs); 
    glAttachShader(program, fs); 
    glLinkProgram(program); 
    glValidateProgram(program); 

    glDeleteShader(vs); 
    glDeleteShader(fs); 

    return program; 
} 

int main(void) 
{ 
    GLFWwindow* window; 

    /* Initialize the library */ 
    if (!glfwInit()) 
     return -1; 

    /* Create a windowed mode window and its OpenGL context */ 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

    /* Make the window's context current */ 
    glfwMakeContextCurrent(window); 

    if (glewInit() != GLEW_OK) 
     std::cout << "Error!" << std::endl; 

    float positions[6] = {-0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.5f}; 

    unsigned int buffer = 0; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); 

    std::string vertexShader = 
     "#version 330 core\n" 
     "\n" 
     "layout(location=0)in vec4 position;\n" 
     "\n" 
     "void main()\n" 
     "{\n" 
     " gl_Position = position;\n" 
     "}\n"; 

    std::string fragmentShader = 
     "#version 330 core\n" 
     "\n" 
     "layout(location=0)out vec4 color;\n" 
     "\n" 
     "void main()\n" 
     "{\n" 
     " color = vec4(0.0, 0.0, 1.0, 1.0);\n" 
     "}\n"; 

    unsigned int shader = CreateShader(vertexShader, fragmentShader); 
    glUseProgram(shader); 
    /* Loop until the user closes the window */ 
    while (!glfwWindowShouldClose(window)) 
    { 
     /* Render here */ 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glBindVertexArray(buffer); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glfwPollEvents(); 
     /* Swap front and back buffers */ 
     glfwSwapBuffers(window); 

     /* Poll for and process events */ 
     glfwPollEvents(); 
    } 
    glDeleteShader(shader); 

    glfwTerminate(); 
    return 0; 
} 
+0

私が使用していません今はOpenGLですが、フラグメントシェーダの 'color'変数は' out vec4 color;と 'layout(location = 0)'なしで宣言されるべきではありませんか? – ProXicT

答えて

5

あなたの「三角形」は、あなたがそれを見ることができないので、それは、ラインである三角形ではありません。

float positions[6] = {-0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.5f}; 

に変更し、それを:

float positions[6] = {-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.5f}; 
+0

ありがとうたくさんのおい、それは働いた:) – akshay

関連する問題