繁体   English   中英

C++ OpenGL:三角形未出现在屏幕上

[英]C++ OpenGL: Triangle doesnt appear in the screen

我正在按照教程使用 OpenGL 在屏幕上绘制三角形。 我已正确执行所有步骤,但我只得到一个绿屏,没有三角形。

这是我当前的代码。 DrawScene 在应用程序的初始化过程中被调用,并在每个 WM_DRAW 中调用 ResizeScene。 我的问题是:为什么我的代码没有显示三角形?

OpenGL 版本:4.6

#include "glew.h"

GLuint program;
GLuint VAO, VBO, EBO;

void DrawScene(HWND _hWnd);

void SetupShaders()
{
    const char* vertexSource = {
        "#version 130 core\n"

        "layout (location = 0) in vec3 iPos;\n"

        "void main()\n"
        "{\n"
        "   gl_Position = vec4(iPos, 1.0f);\n"
        "}\n"
        "\0"
    };
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexSource, NULL);
    glCompileShader(vertexShader);

    const char* fragmentSource = {
        "#version 130 core\n"

        "out vec4 FragColor;\n"

        "void main()\n"
        "{\n"
        "   FragColor = vec4(1.0f, 0.0f, 1.0f, 1.0f);\n"
        "}\n"
        "\0"
    };
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
    glCompileShader(fragmentShader);

    program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glBindAttribLocation(program, 0, "iPos");
    glLinkProgram(program);
}
void SetupBuffers()
{
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    float vertexData[] = {
        0.0f, 0.0f, 0.0f,
        10.0f, 10.0f, 0.0f,
        10.0f, 0.0f, 0.0f,
        0.0f, 10.0f, 0.0f
    };
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    unsigned int indexData[] = {
        0, 1, 2,
        1, 2, 3
    };
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);

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

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

void SetupScene(HWND& _hWnd)
{
    static PIXELFORMATDESCRIPTOR pfd =                  // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),                  // Size Of This Pixel Format Descriptor
        1,                              // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                       // Must Support Double Buffering
        PFD_TYPE_RGBA,                          // Request An RGBA Format
        32,                               // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                       // Color Bits Ignored
        0,                              // No Alpha Buffer
        0,                              // Shift Bit Ignored
        0,                              // No Accumulation Buffer
        0, 0, 0, 0,                         // Accumulation Bits Ignored
        16,                             // 16Bit Z-Buffer (Depth Buffer)
        0,                              // No Stencil Buffer
        0,                              // No Auxiliary Buffer
        PFD_MAIN_PLANE,                         // Main Drawing Layer
        0,                              // Reserved
    };
    HDC hdc = GetDC(_hWnd);
    int pf = ChoosePixelFormat(hdc, &pfd);

    SetPixelFormat(hdc, pf, &pfd);
    
    HGLRC hglrc = wglCreateContext(hdc);
    wglMakeCurrent(hdc, hglrc);

    glewInit();

    ShowWindow(_hWnd, SW_SHOW);
    SetForegroundWindow(_hWnd);
    SetFocus(_hWnd);

    SetupShaders();
    SetupBuffers();

}

void ResizeScene(HWND& _hWnd, size_t _width, size_t _height)
{
    if (!_height)
    {
        _height = 1;
    }
    glViewport(0, 0, _width, _height);
    DrawScene(_hWnd);
}

void DrawScene(HWND _hWnd)
{
    HDC hdc = GetDC(_hWnd);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);

    glUseProgram(program);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);

    SwapBuffers(hdc);
}

您确实需要启用调试验证层并检查错误,因为您的代码中有一大堆容易发现的误解:

  1. 不要使用glBindAttribLocation iPos已经(正确地)绑定到布局位置 0,您只是在破坏它。

  2. 链接程序后,您没有分离和删除着色器程序,因此泄漏了 memory。

  3. 不要从您的顶点数组中取消绑定顶点和元素缓冲区,这是首先使用它的重点。

  4. 与 3 相关,不要在每次渲染时更改顶点数组的顶点和元素缓冲区。 您设置了一次顶点缓冲区。

  5. 您告诉 OpenGL 您的索引元素是glDrawElements中的字节,而是将它们作为 32 位整数上传。 始终如一。

暂无
暂无

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

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