使用 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 中使用顶点缓冲区对象绘图不起作用