2016-06-14 3 views
3

Ich habe eine Reihe von Scheitelpunkte im Punkte-Array angegeben, um ein Dreieck zu zeichnen, das von der oberen Mitte des Fensters aus beginnt - (+ 0.0f, + 1.0f, + 0.0f) - durch die untere linke Ecke gehen - (-1.0f, -1.0f, + 0.0f) - und schließlich in der unteren rechten Ecke des Fensters endet - + 1.0f, -1.0f, + 0.0f. Das Dreieck wird jedoch nicht wie oben erwartet gerendert, da es so aussieht, als ob es von der oberen Mitte des Fensters beginnt, dann in die obere linke Ecke geht und schließlich in der Mitte des Fensters endet. Ich habe zwei Screenshots hinzugefügt, um meine Problembeschreibung unten zu unterstützen.OpenGL: Unexpected Scheitelpunkte eines bestimmten Dreiecks

Unexpected rendering

Expected triangle hinted in red

#include <cstdio> 
#include <cstdlib> 

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

int main() { 
    // GLFW 
    if (!glfwInit()) { 
     fprintf(stderr, "ERROR: could not start GLFW3\n"); 
     return EXIT_FAILURE; 
    } 

    // Create window 
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Test", NULL, NULL); 
    if (!window) { 
     fprintf(stderr, "ERROR: could not open window with GLFW3\n"); 
     glfwTerminate(); 
     return EXIT_FAILURE; 
    } 
    glfwMakeContextCurrent(window); 

    // GLEW 
    glewExperimental = GL_TRUE; 
    glewInit(); 

    // Get version info 
    const GLubyte* renderer = glGetString(GL_RENDERER); 
    const GLubyte* version = glGetString(GL_VERSION); 
    printf("Renderer: %s\n", renderer); 
    printf("Supported OpenGL version: %s\n", version); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    /* Put code here */ 

    // Vertices to be rendered 
    float points[] = { 
     +0.0f, +1.0f, +0.0f 
     -1.0f, -1.0f, +0.0f 
     +1.0f, -1.0f, +0.0f 
    }; 

    // Vertex buffer object 
    GLuint bufferId = 0; 
    glGenBuffers(1, &bufferId); 
    glBindBuffer(GL_ARRAY_BUFFER, bufferId); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 

    // Vertex attribute object 
    GLuint attributeId = 0; 
    glGenVertexArrays(1, &attributeId); 
    glBindVertexArray(attributeId); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, bufferId); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

    // Shaders 
    const char* vertexShaderSource = 
     "#version 400\n" 
     "in vec3 position;" 
     "void main() {" 
     " gl_Position = vec4(position.x, position.y, position.z, 1.0);" 
     "}"; 

    const char* fragmentShaderSource = 
     "#version 400\n" 
     "out vec4 outColor;" 
     "void main() {" 
     " outColor = vec4 (0.0, 0.0, 1.0, 1.0);" 
     "}"; 

    // Compile shaders 
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); 
    glCompileShader(vertexShader); 
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); 
    glCompileShader(fragmentShader); 
    // Link shaders 
    GLuint shaderPorgram = glCreateProgram(); 
    glAttachShader(shaderPorgram, fragmentShader); 
    glAttachShader(shaderPorgram, vertexShader); 
    glLinkProgram(shaderPorgram); 

    // Render loop 
    while (!glfwWindowShouldClose(window)) { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glUseProgram(shaderPorgram); 
     glBindVertexArray(attributeId); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glfwPollEvents(); 
     glfwSwapBuffers(window); 
    } 

    glfwTerminate(); 
    return EXIT_SUCCESS; 
} 
+1

Wow, ein komplettes, aber kurzes Stück Code? Eine kurze Beschreibung des Problems mit Beispielbildern? Könnte uns auch geben Kuchen frei! –

Antwort

6

Fehlende Kommas.

float points[] = { 
    +0.0f, +1.0f, +0.0f 
    -1.0f, -1.0f, +0.0f 
    +1.0f, -1.0f, +0.0f 
}; 

Sollte sein:

float points[] = { 
    +0.0f, +1.0f, +0.0f, 
    -1.0f, -1.0f, +0.0f, 
    +1.0f, -1.0f, +0.0f, 
}; 

Das letzte Komma ist nicht notwendig, aber es erlaubt ist, und ich ziehe es als eine Frage des Stils.