После всего, мне удалось найти простой кусок кода, который показывает, как рисовать 2D-изображение с openGL:
#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
#include "SDL/SDL_image.h"
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
int tex;
int loadTexture(char* fileName){
SDL_Surface *image=IMG_Load(fileName);
SDL_DisplayFormatAlpha(image);
GLuint object;
glGenTextures(1,&object);
glBindTexture(GL_TEXTURE_2D,object);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,image->w,image ->h,0,GL_RGBA,GL_UNSIGNED_BYTE,image->pixels);
SDL_FreeSurface(image);
return object;
}
void init(){
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,800,600,1.0,-1.0,1.0);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
tex = loadTexture("hi.png");
}
void draw(){
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D,tex);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2f(0,0);
glTexCoord2f(1,0);
glVertex2f(500,0);
glTexCoord2f(1,1);
glVertex2f(500,500);
glTexCoord2f(0,1);
glVertex2f(0,500);
glEnd();
glFlush();
}
int main(int argc,char** argv){
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_OPENGL);
bool running=true;
Uint32 start;
SDL_Event event;
init();
while(running){
start=SDL_GetTicks();
draw();
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
running=false;
break;
}
}
SDL_GL_SwapBuffers();
if(1000/60>(SDL_GetTicks()-start))
SDL_Delay(1000/60-(SDL_GetTicks()-start));
}
SDL_Quit();
return 0;
}
Я неопытный в 2D, и около недели назад начал возиться с SDL. Построил несколько простых структур для изображений, которые были бы на слоях, чтобы у меня был свой порядок рисования, чтобы спрайты рисовались после фона и т. Д., А затем выполнялся небольшой «движок спрайтов». Я получил спрайт Megaman, идущий влево и вправо, как я и хотел, над простым фоновым изображением 900x900.
Дело в том, что процессор почти достиг 20% на моем i5 ... поэтому я подумал об использовании графической карты для рисования! Добавил abit в OpenGL и сегодня, наконец-то, удалось запустить gl3w!
Поэтому сейчас я ищу простой способ отображения моих спрайтов / изображений в окне с помощью OpenGL. Я перепробовал все виды кода, с которым столкнулся, но ничего не могу отобразить, несмотря на то, что я делал проверки ошибок практически везде, и все, кажется, оказалось правильным!
TL: DR; Я искал какой-то простой рабочий код с использованием SDL для рисования 2D-изображений (который, если он не работает, наверняка у меня что-то не так).
Спасибо!
Ответы:
Я рекомендую загружать ваши спрайты с помощью SOIL , а затем рендерить их, просто рисуя текстурированные квадраты. Если вы сделаете это без каких-либо устаревших функций (используйте шейдеры), вы обнаружите, что это очень быстро.
источник
Вот довольно простая, но отличная отправная точка для рисования текстурированных четырехугольников в OpenGL, от этой отправной точки функции у меня есть 7 других функций, которые предоставляют немного другие функциональные возможности, рисование с тонированными цветами, рисование элементов с другими альфа-значениями, и затем у нас есть вращение, отсечение и т. д. и т. д. Но это должно помочь вам начать :).
Редактировать: обновленный код;
Изображение - это базовая структура, содержащая данные текстуры (GLuint), а затем два целых числа для хранения ширины и высоты.
источник
Вам нужен SDL? SFML является альтернативой SDL, которая использует OpenGL для рендеринга. Это также может быть проще для начинающих из-за объектно-ориентированного API.
источник