使用 SDL 和 openGL 绘图原语不起作用

Posted

技术标签:

【中文标题】使用 SDL 和 openGL 绘图原语不起作用【英文标题】:Using SDL and openGL drawing primitives does not work 【发布时间】:2015-09-07 17:38:55 【问题描述】:

我尝试按照教程做一些基本的东西,例如游戏循环和使用 OpenGL 绘图。在那个教程中使用了 SDL 1.2,但我使用的是 2.0,所以我不得不用新版本替换一些旧功能。

很遗憾,我要画的线条没有显示出来。

我已经尝试过使用数字,以使线条不在窗口之外,但它不起作用。

#include "SDL.h"
#include "SDL_opengl.h"
#include <iostream>

int main(int argc, char* args[])

//initialize SDL
SDL_Init(SDL_INIT_EVERYTHING);

//Set openGL memory usage
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

SDL_Window *window;
window=SDL_CreateWindow("MyWindow",
                SDL_WINDOWPOS_CENTERED,
                SDL_WINDOWPOS_CENTERED,
                600,400,
                SDL_WINDOW_OPENGL);

SDL_Renderer *renderer;
renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(renderer,255,255,255,255);//RGB/ALPHA


glShadeModel(GL_SMOOTH);

//2D rendering
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//Disable depth checking
glDisable(GL_DEPTH_TEST);

std::cout<<"OpenGL is running\n";
std::cout<<"Main loop has started\n";

//Handle GameLoop
bool isRunning=true;
//Handel events
SDL_Event event;
//main gameloop
while(isRunning)

    //Events
    while(SDL_PollEvent(&event))
    
        if(event.type==SDL_QUIT)
            isRunning=false;
        //if esc button is released
        if(event.type==SDL_KEYUP&&event.key.keysym.sym==SDLK_ESCAPE)
            isRunning=false;
        if(event.type==SDL_KEYUP&&event.key.keysym.sym==SDLK_r)
            SDL_SetRenderDrawColor(renderer,255,0,0,255);
        //Logic for certain events
    

    //Logic

    //Rendering
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);

    glPushMatrix();
    glOrtho(0,600,400,0,-1,1); //Set matrix


    glBegin(GL_LINES);//start drawing
        glColor4ub(255,0,0,255);
        glVertex2i(0,0);
        glVertex2i(600,400);
    glEnd();// end drawing

    glPopMatrix();

    SDL_GL_SwapWindow(window);


SDL_Quit();

return 0;

【问题讨论】:

【参考方案1】:

不要混合使用 SDL_Renderer 代码和 OpenGL。 SDL2 中没有任何规定(可能永远存在)用于重置您使用原始 GL 代码践踏的渲染器 GL 状态(如果它使用 GL 后端)。

【讨论】:

【参考方案2】:

首先,不要混合使用 OpenGL 和 SDL_Renderer 的东西。然后,您实际上需要为您的窗口创建一个 OpenGL 上下文,然后才能进行渲染。在您的 SDL_CreateWindow 通话后使用它:

SDL_GLContext glcontext = SDL_GL_CreateContext(window);

最后你需要释放上下文:

SDL_GL_DeleteContext(glcontext);

【讨论】:

以上是关于使用 SDL 和 openGL 绘图原语不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL ES 1.1 中使用顶点缓冲区对象绘图不起作用

用于包装 SDL 和 OpenGL 绘图方法的虚拟函数的替代方案

为啥我的 OpenGL 纹理不起作用?

glClearColor 不起作用

SDL2中使用OpenGL绘图

OpenGL VBO 不显示