OpenGL:指定三角形的顶点位置出现意外情况

3
我在点阵数组中指定了一组顶点来绘制一个三角形,这个三角形应该从窗口的中上部开始 - (+0.0f,+1.0f,+0.0f) - 经过左下角 -(-1.0f,-1.0f,+0.0f)- 最后结束于窗口的右下角- +1.0f,-1.0f,+0.0f。 然而,三角形的渲染结果并不如预期那样,它看起来像是从窗口的中上部开始,然后到达左上角,最后停留在窗口的中间。 我在下面附加了两张屏幕截图以帮助描述问题。 意外的渲染结果 预期的三角形(以红色标注)
#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
哇,一段完整而简短的代码?一个带有示例图片的简洁问题描述?这简直就像是在给我们送免费蛋糕! - Dietrich Epp
1个回答

5

缺少逗号。

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

Should be:

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

最后一个逗号不是必需的,但它是被允许的,而我个人更喜欢加上它以符合风格要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接