【问题标题】:GLFW and GLEW not showing triangle redGLFW 和 GLEW 未显示红色三角形
【发布时间】:2021-08-21 08:07:35
【问题描述】:

我的代码没有显示红色三角形,而是黑屏。我正在关注 The Cherno 的 OpenGL 教程。这发生在第7集的结尾。我在 Windows 10 Home 上使用 Visual Studio 2019 和 Visual C++。我的显卡是 NVidia 820m.Link for tutorial I was following.

#include <gl/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>

static unsigned int CompileShader(unsigned int type, const std::string& source)
{
    unsigned int id = glCreateShader(type);
    const char* src = source.c_str();
    glShaderSource(id, 1, &src, nullptr);
    glCompileShader(id);

    int result;
    
    glGetShaderiv(id, GL_COMPILE_STATUS, &result);
        if (result = GL_FALSE) 
        {
            int legnth;
            glGetShaderiv(id, GL_INFO_LOG_LENGTH, &legnth);
            char* message = (char*)alloca(legnth * sizeof(char));
            glGetShaderInfoLog(id, legnth, &legnth, message);
            std::cout << "Failed to Compile" << (type == GL_VERTEX_SHADER ? "Vertex: Shader:\n" : "Fragment Shader:\n");
            glDeleteShader(id);
            
            return 0;
        }

    return id;
}

static unsigned int CreateShader(const std::string& vertexShader, const std::string& fragmentShader) 
{
    unsigned int program = glCreateProgram();
    unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
    unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);
    glValidateProgram(program);

    glDeleteShader(vs);
    glDeleteShader(fs);

    return program;
}

int main(void)
{
    GLFWwindow* window;
    if (!glewInit())
        return -1;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */

    window = glfwCreateWindow(640, 480, "Cooked Pixel", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }
    
    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    if (glewInit() != GLEW_OK) 
    {
        std::cout << "Error: GLEW is not initialized \n";
    }

    std::cout << "GL Version" << glGetString(GL_VERSION) << "\n";
    
    float positions[6] = {
        -0.5, -0.5,
        0.0, -0.5,
        0.5, -0.5
    };
    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
    
    std::string vertexShader = R"glsl(
    #version 330 core
    layout(location = 0) in vec4 position;
    void main()
    {
        gl_Position = position;
    }
        
    )glsl";

    std::string fragmentShader = R"glsl(
    #version 330 core
    layout(location = 0) out vec4 color;
    void main()
    {
        color = vec4(1.0, 0.0, 0.0, 1.0);
    }
        
    )glsl";
    unsigned int shader = CreateShader(vertexShader, fragmentShader);

    glUseProgram(shader);

    glfwMaximizeWindow(window);
    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        /* Very Old Code
        
        glBegin(GL_TRIANGLES);
        glVertex2f(-1.0, -1.0);
        glVertex2f(0, -1.0);
        glVertex2f(0, -3.0);
        glEnd();
        */
        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

【问题讨论】:

    标签: c++ opengl visual-c++ glfw glew


    【解决方案1】:

    你的“三角形”不是三角形,它只是一条直线。

    float positions[6] = {
      -0.5, -0.5,
       0.0, -0.5,
       0.5, -0.5
    };
    

    改变顶点坐标:

    float positions[6] = {
        -0.5, -0.5,
         0.0, -0.5,
         0.5, 0.5
    };
    

    请勿两次拨打glewInit()。在使用glfwMakeContextCurrent 使 OpenGL 上下文成为当前状态后调用它一次。


    另外你应该创建一个Vertex Array Object:

    unsigned int vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    
    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2012-11-19
      • 1970-01-01
      • 2018-07-26
      • 2020-04-05
      相关资源
      最近更新 更多