首页 > 解决方案 > 在现代 OpenGL 中渲染三角形时遇到问题

问题描述

我期待程序在灰色背景上渲染一个简单的三角形,但它渲染 了一个背景但没有三角形。

我的编译器没有显示警告或错误,SDL2GLAD也没有。我得出的结论是,这种行为的原因包含在这两个代码片段中的任何一个中。作为参考,我正在用 C 语言进行编程,并使用 OpenGL 4.2。

在 shader.h 中

#ifndef SHADER_H
#define SHADER_H

// vertex shader
const char* vertexShaderSrc = 
    "#version 420 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\0";

unsigned int vShader;



// fragment shader
const char* fragmentShaderSrc =
    "#version 420 core\n"
    "out vec4 FragColor;\n"
    "void main()\n"
    "{\n"
    "   FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
    "}\n\0";

unsigned int fShader;

// shader program
unsigned int sProgram;

#endif // SHADER_H

在 main.c 中

    // SETUP TRIANGLE
    float triVertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f, -0.5f, 0.0f
    };

    // vertex buffer object / vertex array object
    unsigned int vbo, vao;
    glGenVertexArrays(1, &vao);
    glGenBuffers(1, &vbo);

    // vao
    glBindVertexArray(vao);

    // vbo
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triVertices), triVertices, GL_STATIC_DRAW);

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

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);


    // vertex shader
    vShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vShader, 1, &vertexShaderSrc, NULL);
    glCompileShader(vShader);

    glGetShaderiv(vShader, GL_COMPILE_STATUS, &success);
    if(!success) {
        glGetShaderInfoLog(vShader, 512, NULL, infoLog);
        printf("vertex shader error: %s\n", infoLog);
        isRunning = false;
    }


    // fragment shader
    fShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fShader, 1, &fragmentShaderSrc, NULL);
    glCompileShader(fShader);

    glGetShaderiv(fShader, GL_COMPILE_STATUS, &success);
    if(!success) {
        glGetShaderInfoLog(fShader, 512, NULL, infoLog);
        printf("fragment shader error: %s\n", infoLog);
        isRunning = false;
    }


    // shader program
    sProgram = glCreateProgram();

    glAttachShader(sProgram, vShader);
    glAttachShader(sProgram, fShader);
    glLinkProgram(sProgram);

    glGetProgramiv(sProgram, GL_LINK_STATUS, &success);
    if(!success) {
        glGetProgramInfoLog(sProgram, 512, NULL, infoLog);
        printf("shader program errror: %s\n", infoLog);
        isRunning = false;
    }

    glDeleteShader(vShader);
    glDeleteShader(fShader);



    // APPLICATION LOOP
    while(isRunning) {
        while(SDL_PollEvent(&event)) {
            switch(event.type) {
                case SDL_QUIT:
                    isRunning = false; 
                    break;
                default: 
                    break;
            }
        }

        // display
        glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
        glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

        glUseProgram(sProgram);
        glBindVertexArray(vao);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        SDL_GL_SwapWindow(window);
    }

我试图通过更改数字函数的放置顺序、为这些函数指定不同的值以及修改我的着色器的源代码来解决我的问题。这些操作似乎都不起作用,因此我已将代码恢复为原始状态。我回顾了我的参考资料,看看我是否遗漏了什么,但我无法找到任何东西。

标签: copengl

解决方案


好像你的三角形的顶点有相同的 Y 坐标

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

应该

float triVertices[] = {
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f, +0.5f, 0.0f    // here I have changed -0.5 to +0.5
};

小更新:发布后我查看了参考资料,这证实了我的猜测。三角形的第三个顶点具有相同的 Y 值。

只要 SDL 和 OpenGL 的着色器编译器不产生任何警告,程序的其余部分似乎都很好。


推荐阅读