OpenGL不绘制到SDL2窗口

OpenGL Not Drawing To SDL2 Window

本文关键字:SDL2 窗口 绘制 OpenGL      更新时间:2023-10-16

所以我正在用c++制作游戏,我使用SDL2和OpenGL/GLEW。我试图只是画基本的形状到我的窗口,然而,它只是创建一个黑屏时,它应该画一个三角形。这是代码

游戏循环:

int main(int argc, char** argv) {
    Window window("Test", 600, 400);
    RenderingEngine e(window);
    e.Init();
    while (!window.IsCloseRequested()) {
        window.SwapBuffers();
        e.Render();
    }
    return 0;
}

窗口类:

Window::Window(const std::string& title, unsigned int width, unsigned int height) :
    m_title(title), m_width(width), m_height(height), m_isCloseRequested(false) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
        width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    m_glContext = SDL_GL_CreateContext(m_window);
    SDL_GL_MakeCurrent(m_window, m_glContext);
    SDL_GL_SetSwapInterval(1);
    glewExperimental = GL_TRUE;
    GLenum res = glewInit();
    if (res != GLEW_OK) {
        std::cerr << "Error initializting OpenGL." << std::endl;
        exit(1);
    }
}
void Window::SwapBuffers() {
    SDL_GL_SwapWindow(m_window);
}

RenderingEngine类:

RenderingEngine::RenderingEngine(const Window& window) : m_window(&window) {
}
RenderingEngine::~RenderingEngine() {
    if (m_window) delete m_window;
}
void RenderingEngine::Init() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glFrontFace(GL_CW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_FRAMEBUFFER_SRGB);
}
void RenderingEngine::Render() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_TRIANGLES);
        glVertex3f(-1.0f, -1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);
    glEnd();
}

我不明白为什么它没有画到屏幕上,所以任何帮助都是非常感激的。谢谢!

你正在设置背面剔除,指定你的正面三角形有顺时针卷曲顺序,你想剔除所有不是正面的:

glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);

但是你指定的三角形有逆时针的缠绕顺序:

glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);

你可以通过在一张纸上画点来验证这一点,x轴向右,y轴向上。你会看到点的顺序是围绕原点逆时针的。

基于此,你的三角形被背面剔除。由于使用逆时针缠绕顺序在OpenGL中更常用,我建议通过将glFrontFace()调用更改为:

来使用它。
glFrontFace(GL_CCW);

或者根本不调用,因为这是默认值

你没有加载视图/投影/模型矩阵…我想那会是个问题……如果你想在3.2样式

中使用着色器