c++ - 无法使用 OpenGL 创建彩色三角形

标签 c++ opengl graphics

我正在关注 open.gl,我已经进入渲染阶段,但我的三角形没有出现在屏幕上。只有一个黑盒子。

我使用的是 Win7、最新的驱动程序和一切,VS2013。

为了简单起见,我把代码放在这里:

#define GLEW_STATIC

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

using namespace std;


int main() {
    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, "OpenGL", nullptr, nullptr);

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    glewInit();

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

    GLuint vbo;
    glGenBuffers(1, &vbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

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

    const char* vertexShaderCode =
        "#version 150\n"
        "in vec2 position;"
        "void main() {"
        "   gl_Position = vec4(position, 0.0, 1.0);"
        "}";

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

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderCode, NULL);
    glCompileShader(vertexShader);

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderCode, NULL);
    glCompileShader(fragmentShader);

    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);

    glBindFragDataLocation(shaderProgram, 0, "outColor");

    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");

    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glEnableVertexAttribArray(posAttrib);

    GLuint vao;
    glGenVertexArrays(1, &vao);

    glBindVertexArray(vao);

    while(!glfwWindowShouldClose(window)) {  
        glfwPollEvents();
        glfwSwapBuffers(window);

        glDrawArrays(GL_TRIANGLES, 0, 3);
    }

    glfwTerminate();
}

最佳答案

在指定顶点布局之前绑定(bind) VAO:

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

GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);

关于c++ - 无法使用 OpenGL 创建彩色三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760962/

相关文章:

c++ - 使用 XFT 库绘制彩色字符串的更快方法是什么?

c++ - 使用 atoi 的不同结果

c - 如何检测 openGL/card 是否支持 2 的非幂?

c++ - 如何在 C++ 过剩中创建 2D 对象的橡胶式拖动和移动

c++ - gltf 没有在皮肤中指定骨架值是什么意思?

c++ - 在 C++ 中绘制(基元、线条等)的最佳通用跨平台解决方案?

c++ - DirectX 窗口媒体键无响应

c++ - 从一个目录中读取许多小文件会有多大问题?

c++ - DirectX9 中的访问冲突

c++ - OpenCV Mat 到 OpenGL - glBindTexture() 错误