当前位置: 首页 > 知识库问答 >
问题:

C++OpenGL:屏幕中不出现三角形

夹谷星剑
2023-03-14

我正在按照教程使用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个答案

郜谦
2023-03-14

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

>

  • 不要使用GLBindatTribLocationIPOS已(正确地)绑定到布局位置0,您只是破坏了它。

    您没有分离和删除您的着色程序后,您链接的程序,因此泄漏了内存。

    不要解除顶点和元素缓冲区与顶点数组的绑定,这是使用顶点数组的全部要点。

    与3相关,不要在每次呈现时更改顶点数组的顶点和元素缓冲区。只需设置一次顶点缓冲区。

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

  •  类似资料:
    • 手指任意点击屏幕三点,绘制三角形。 [Code4App.com]

    • 我有一个问题,找到一种方法来在正确的时间烧毁游戏结束屏幕。我做了一个平台上pyplay和我想游戏在屏幕上出现后,我的角色死亡的动画已经发生,当敌人有他的攻击动画。现在它绕过任何动画,一旦精灵之间的冲突检测为真,它就说游戏结束。有什么想法吗? 谢谢

    • 问题内容: 我正在学习有关使用OpenGL在Java中创建游戏引擎的教程。 我正在尝试在屏幕上渲染一个三角形。一切运行正常,我可以更改背景颜色,但三角形不会显示。我也尝试过运行作为教程系列的一部分提供的代码,但仍然无法正常工作。 链接至教程:http : //bit.ly/1EUnvz4 链接到视频中使用的代码:http : //bit.ly/1z7XUlE 建立 我试过检查OpenGL版本,但相

    • 我们当前的任务要求我们在openGL中使用较旧的固定管道方法。我们使用的是LWJGL 2.9.3。下面的代码显示一个三角形。问题是,它会疯狂地闪烁。显示器。swapBuffers()方法不会引发异常,并且无论是否包含它都没有任何区别。我根据这个问题创建了这个示例: gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_MODELVIEW矩阵 编辑 还有一件事

    • 我正试图用java设计一个程序,定期(每100毫秒左右)拍摄我的屏幕截图,并计算整个屏幕的平均像素rgb值。我需要这个来处理视频游戏和iTunes/Quicktime视频。然而,我曾尝试使用JNA和robot来捕获屏幕,它只在我没有捕获全屏或iTunes视频的视频游戏时起作用。例如,我通过保存一个图像来测试代码,以检查并查看发生了什么。当我玩电子游戏时,我只看到一个空白窗口的截图。我认为这是因为游

    • 我在给吉拉写小玩意时总是遇到一些奇怪的问题。我遇到了一些问题,比如选项被剪掉了,重新配置不起作用,最令人恼火的是:projectOrFilterPicker不起作用。 我遇到的大多数奇怪问题我都可以解决,这就是我所做的,但是我需要允许用户使用快速搜索框来选择项目或过滤器。然而,当我加入其中一个对话框时,这个小工具就会无休止地加载,如果我调整屏幕大小(我用于其他事情的解决方法之一),我会得到一个错误