OpenGL 不绘制到 SDL2 窗口

Posted

技术标签:

【中文标题】OpenGL 不绘制到 SDL2 窗口【英文标题】:OpenGL Not Drawing To SDL2 Window 【发布时间】:2014-07-12 19:10:09 【问题描述】:

所以我正在用 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(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();

我无法弄清楚为什么它没有绘制到屏幕上,因此非常感谢任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

您正在设置背面剔除,指定您的正面三角形具有顺时针缠绕顺序,并且您想要剔除所有不是正面的东西:

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);

或者根本不拨打电话,因为这是默认设置。

【讨论】:

我将剔除更改为逆时针顺序并正确排列了我的顶点,但是绘制时它仍然只是一个黑屏。 不需要改变顶点,它们已经是逆时针的了。 顶点是正确的,逆时针顺序,但屏幕仍然只是黑色。【参考方案2】:

您没有加载视图/投影/模型矩阵...我想这将是一个问题...如果您想以 3.2 样式制作,您应该使用着色器

【讨论】:

以上是关于OpenGL 不绘制到 SDL2 窗口的主要内容,如果未能解决你的问题,请参考以下文章

SDL2+OpenGL 绘制立体图形

SDL2 使用高版本opengl

SDL2 使用高版本opengl

SDL2+OpenGL 绘制多边形

使用 openGL 在 SDL2 中全屏显示窗口

SDL2 OpenGL 窗口立即关闭