2016-06-14 5 views
3

ポイント配列の頂点のセットを指定して、ウィンドウの上部中央から始まると思われる三角形を描画しました - (+ 0.0f、+ 1.0f、+ 0.0f ) - 左下の - (-1.0f、-1.0f、+ 0.0f)を通り、最後にウィンドウの右下隅で終わります。+ 1.0f、-1.0f、+ 0.0f。 しかし、三角形は上のように表示されません。なぜなら、三角形はウィンドウの中央から始まり、次に左上に進み、最後にウィンドウの中央で終わるように見えるからです。 以下に私の問題の説明に役立つ2つのスクリーンショットを掲載しました。カンマがありませんOpenGL:指定された三角形の予期しない頂点の位置

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

うわー、完全で短いコードですね。サンプル画像の問題の簡潔な説明?私たちに無料のケーキを与えてくれるかもしれません! –

答えて

6

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

は次のようになります。

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

最後のコンマは必要ありませんが、それは許可されていると私はスタイルの問題としてそれを好みます。

関連する問題