OpenGL不从顶点缓冲区渲染三角形

cngwdvgl  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(176)

我的程序没有渲染任何对象,并显示一个空白屏幕。我已经检查了任何OpenGL错误,但没有找到任何错误。

头文件(Display.h):


# include "glew.h"

# include "glfw3.h"

# include <iostream>

class Display
{

public:
    Display() {
        glfwInit();

        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); 
        if (window == nullptr)
        {
            window = glfwCreateWindow(649, 489, "GL_Lib", NULL, NULL);
        }
        glfwMakeContextCurrent(window); 
        glewInit(); 
    };
    static GLFWwindow* window;

    void Create_Buffer(float f, float s, float t, float forth, float fifth, float sixth, unsigned int* ptr) {
        float positions[6] = { f,s,t,forth,fifth,sixth };
        glGenBuffers(1, ptr);
        glBindBuffer(GL_ARRAY_BUFFER, *ptr); 
        glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);
        return;
    }
    static unsigned int Create_Shader(const std::string& VertexShader, const std::string FragmentShader) {
        unsigned int program = glCreateProgram(); 
        unsigned int vs = Compile_Shader(VertexShader, GL_VERTEX_SHADER);
        unsigned int fs = Compile_Shader(FragmentShader, GL_FRAGMENT_SHADER);
        glAttachShader(program, vs);
        glAttachShader(program, fs);
        glLinkProgram(program);
        glValidateProgram(program);
        int status;
        glGetProgramiv(program, GL_VALIDATE_STATUS, &status);  
        std::cout << status;
        glDeleteShader(vs);
        glDeleteShader(fs); 

        return program; 
    }
    static unsigned int Compile_Shader(const std::string& source, unsigned int type)
    {
        unsigned int id = glCreateShader(type);
        const char* src = source.c_str(); 

        glShaderSource(id, 1, &src, nullptr);
        glCompileShader(id);
        //TODO: Error Handling
        return id;
    }

    static void GLCheckError() {
        while (GLenum error = glGetError())
        {
            std::cout << "Error (" << error << ")" << std::endl;
        }

    }
    static void GLClearError()
    {
        while(glGetError != GL_NO_ERROR); 
    }

};

CPP文件(Main.cpp):


# pragma once

# include "glew.h"

# include "glfw3.h"

# include "Display.h"

# include <iostream>

int main()
{ 

    Display* dis = new Display();
    unsigned int* buffer = new unsigned int;
    dis->Create_Buffer(-0.5f, -0.5f, 0.0f, -0.5f, 0.5f, -0.5f, buffer);

    std::string vertexShader = 
        "#version 330 coren"
        "n"
        "layout(location = 0) in vec4 position;n"
        "n"
        "void main()n"
        "{n"
        "gl_Position = position;n"
        "}n";

    std::string fragmentShader =
        "#version 330 coren"
        "n"
        "layout(location = 0) out vec4 color;n"
        "n"
        "void main()n"
        "{n"
        "color = vec4(1.0, 0.0, 0.0, 1.0);n"
        "}n";

    unsigned int shader = Display::Create_Shader(vertexShader, fragmentShader);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    while (!glfwWindowShouldClose(Display::window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shader);
        // draw points 0-3 from the currently bound VAO with current in-use shader
        glDrawArrays(GL_TRIANGLES, 0, 3);

        /* Swap front and back buffers */
        glfwSwapBuffers(Display::window);

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

        Display::GLCheckError();
    }

    glfwTerminate();
    return 0;
}

我还有一个Display.cpp文件,但这只是为了解析GLFW窗口符号。

68de4m5k

68de4m5k1#

坐标定义的不是三角形,而是一条直线。因此,不会渲染任何三角形基本体。更改坐标:

dis->Create_Buffer(-0.5f, -0.5f, 0.0f, -0.5f, 0.5f, -0.5f, buffer);

dis->Create_Buffer(-0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f, buffer);

相关问题