【问题标题】:OpenGL cannot draw with glVertexAttrib in core profileOpenGL 无法在核心配置文件中使用 glVertexAttrib 进行绘制
【发布时间】:2018-07-05 21:47:12
【问题描述】:

我想使用 OpenGL 3.1。 我正在使用带有 2 个显卡的 Macbook Pro:NVIDIA GeForce GT 650M 1024 MB 和 Intel HD Graphics 4000 1536 MB。它们都支持 OpenGL 4.1。

以前我可以画一个三角形,但是,我的程序使用的是 2.1 版。因此我添加了:SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);。但是,现在不再绘制三角形了。

#include <string>
#include <iostream>
#include <SDL2/SDL.h>

#define GL3_PROTOTYPES 1
#include "../include/GL3/gl3.h"

int main(int argc, const char *argv[]) {
    // Initialize the SDL
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cout << "Failed to initialize the SDL: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return -1;
    }

    // Configure the SDL to use OpenGL 3.1
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);

    // ======= HERE =======
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    // ====================

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_Window* window = SDL_CreateWindow("Triangle Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

    if (window == 0) {
        std::cout << "Error when creating the window: " << SDL_GetError() << std::endl;
        SDL_Quit();

        return -1;
    }

    // Create the OpenGL context
    SDL_GLContext contextOpenGL = SDL_GL_CreateContext(window);

    // Initialization may fail
    if (contextOpenGL == 0) {
        std::cout << SDL_GetError() << std::endl;
        SDL_DestroyWindow(window);
        SDL_Quit();
        return -1;
    }

    SDL_Event events;
    bool end = false;

    // Define the vertices of our triangle
    static const GLfloat vertices[] = {0.0,  1.0,  // left point
        -0.5, 0.0,  // right point
        0.5,  0.0}; // upper point
    const int TRIANGLE_IDX = 0;

    while(!end) {
        SDL_WaitEvent(&events);

        if(events.window.event == SDL_WINDOWEVENT_CLOSE) {
            end = true;
        }

        // Clear the screen
        glClear(GL_COLOR_BUFFER_BIT);

        // Send vertices to OpenGL
        glVertexAttribPointer(TRIANGLE_IDX, 2, GL_FLOAT, GL_FALSE, 0, vertices);

        // Activate our vertex array
        glEnableVertexAttribArray(TRIANGLE_IDX);

        // Draw the points passed previously
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glDisableVertexAttribArray(TRIANGLE_IDX);

        // Refresh the screen
        SDL_GL_SwapWindow(window);
    }
    return 0;
}

我尝试首先使用glGenBuffersglBindBufferglBufferData,但我无法使其工作。

【问题讨论】:

    标签: c++ opengl-3


    【解决方案1】:

    Fixed Function Pipeline 已从核心 OpenGL 3.1 及更高版本中删除。
    您将不得不改用shadersThis site 有一个很好的例子来说明如何使用它们。

    【讨论】:

    • 谢谢,我可以关注“Hello Triangle”部分还是会遇到同样的问题?
    • 应该不是问题,因为它也使用着色器,但如果出现问题,您可以下载源代码并与您的源代码进行比较。
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 2020-08-18
    • 2023-04-10
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多