2016-05-12 13 views
1

Ich meine für den folgenden Code, um eine horizontale Linie über den Bildschirm zu zeichnen. Stattdessen zeichnet er die Linie und zeichnet dann eine Linie, die zum Ursprung hin abfällt. Ein Bild ist unten veröffentlicht.GL_LINE_STRIP endet immer am Ursprung

denke ich, dass die kritischen Teile des Codes sind

float vertices[] = 
{ 
    -0.5, 0.7, 1, 1, 1, 
    0.5, 0.7, 1, 1, 1 
}; 

und

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

while (not glfwWindowShouldClose(window)) 
{ 
    glClearColor(0,0,0,1); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices)/sizeof(float)); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 

Der vollständige Code

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

const GLchar * vertex_shader_source = 
"\ 
    # version 150 core\n\ 
    in vec2 position;\ 
    in vec3 color;\ 
    out vec3 Color;\ 
    void main() { Color = color; gl_Position = vec4(position, 0, 1); }\ 
"; 

const GLchar * fragment_shader_source = 
"\ 
    # version 150 core\n\ 
    in vec3 Color;\ 
    out vec4 outColor;\ 
    void main() { outColor = vec4(Color, 1.0); }\ 
"; 

float vertices[] = 
{ 
    -0.5, 0.7, 1, 1, 1, 
    0.5, 0.7, 1, 1, 1 
}; 

int main (int argc, char ** argv) 
{ 
     // ---- INITIALIZE STUFF ---- // 

    glfwInit(); 

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

    GLFWwindow * window = glfwCreateWindow(800, 600, "open-gl", nullptr, nullptr); 
    glfwMakeContextCurrent(window); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

     // ---- MAKE SHADERS ---- // 

    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); 
    glCompileShader(vertex_shader); 

    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); 
    glCompileShader(fragment_shader); 

    GLuint shader_program = glCreateProgram(); 
    glAttachShader(shader_program, vertex_shader); 
    glAttachShader(shader_program, fragment_shader); 
    glBindFragDataLocation(shader_program, 0, "outColor"); 
    glLinkProgram(shader_program); 

    glUseProgram(shader_program); 

     // ---- MAKE VERTEX BUFFER OBJECT ---- // 

    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 

     // ---- MAKE VERTEX ARRAY OBJECT ---- // 

    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    GLint posAttrib = glGetAttribLocation(shader_program, "position"); 
    GLint colAttrib = glGetAttribLocation(shader_program, "color"); 

    glEnableVertexAttribArray(posAttrib); 
    glEnableVertexAttribArray(colAttrib); 

    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0); 
    glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(2*sizeof(float))); 

     // ---- DO OTHER THINGS ---- // 

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

    while (not glfwWindowShouldClose(window)) 
    { 
     glClearColor(0,0,0,1); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices)/sizeof(float)); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 

     // ---- CLEAN UP ---- // 

    glDeleteProgram(shader_program); 
    glDeleteShader(vertex_shader); 
    glDeleteShader(fragment_shader); 
    glDeleteVertexArrays(1, &vao); 
    glDeleteBuffers(1, &vbo); 

    glfwTerminate(); 

    return 0; 
} 

Der Ausgang ist output ist

Ich habe keine Ahnung, was das Problem ist; Ich habe das Internet durchsucht, aber ich kann niemanden finden, der ein ähnliches Problem hatte. Das Beste, was ich gefunden habe, ist jemand, der gesagt hat, dass OpenGL-Implementierungen nicht dazu neigen, Zeilen sehr gut zu machen. Dies geschieht jedoch nicht mit GL_LINES.

Ich verwende OpenGL 3.2 mit GLFW und GLEW. Ich habe ein Acer Aspire v5-571P-6648; Ich weiß nicht genau, welches Modell der Grafikkarte es hat, aber ich kann es suchen.

Antwort