简体   繁体   English

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

[英]Can't create colored triangle with OpenGL

I'm following open.gl and I have gotten to the rendering stage but my triangle does not appear on the screen. 我正在关注open.gl,现在已经进入渲染阶段,但是我的三角形没有出现在屏幕上。 Only a black box. 只有一个黑匣子。

I'm on Win7, latest drivers and everything, VS2013. 我使用的是Win7,最新的驱动程序以及VS2013。

To make it easy I put the code here: 为了简单起见,我将代码放在这里:

#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 the VAO before you specify the vertex layout: 指定顶点布局之前,请绑定VAO:

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

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

Check all glFw commands for failure. 检查所有glFw命令是否失败。 For debugging check glGetError after every OpenGL command. 要进行调试,请在每个OpenGL命令之后检查glGetError。 Also make sure your shaders have compiled correctly, if not make sure you print the error messages. 另外,请确保着色器已正确编译,否则请确保打印错误消息。

Lastly, check the viewport. 最后,检查视口。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM