Отображение изображения в openGL с SOIL

Я пытаюсь отобразить изображение в openGL с использованием SDL и SOIL, но оно не работает.

#include <SDL.h>
#include <SDL_OpenGL.h>
#include <SOIL.h>

#include "player.h"
#include "Globals.h"
int main(int argc, char** argv){
//Begin SDL initialization
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* Screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_OPENGL);
SDL_Event Event;
//End SDL initialization

//Begin OpenGL initialization
glClearColor(1, 1, 1, 1);//Set colour for empty screen
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);//Enable transparency
glEnable(GL_TEXTURE_2D);

glShadeModel(GL_SMOOTH);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glOrtho(-400, 400, -300, 300, -1, 1);//Set grid for display

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//End OpenGL initialization

Player Player(0, 0, 32, 64, 1, 0, 0, 0.5);
bool gameRunning = true;

while(gameRunning){
while(SDL_PollEvent(&Event)){
if(Event.type == SDL_QUIT)
gameRunning = false;
//If user closed the window in any way stop gameRunning
Player.Events(Event);
}
Player.Update();

glClear(GL_COLOR_BUFFER_BIT);//Clear screen

glPushMatrix();

Player.DisplayWithImage("Brick.png", 32, 64);

glPopMatrix();

SDL_GL_SwapBuffers();//Update screen with new shit
}

SDL_Quit();//Quit SDL
return 0;//End program
}
#pragma once

class Player{
public:
GLfloat X, Y, W, H, R, G, B, A;
bool movingUp, movingRight, movingDown, movingLeft;
GLuint image;

Player(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
GLfloat r, GLfloat g, GLfloat b, GLfloat a);
void Events(SDL_Event &Event);
void Update();
void Display();
void DisplayWithImage(const char* filename, GLsizei w, GLsizei h);
};
#include "Globals.h"
Player::Player(GLfloat x, GLfloat y, GLfloat w, GLfloat h, GLfloat r, GLfloat g, GLfloat b, GLfloat a){
X = x;
Y = y;
W = w;
H = h;
R = r;
G = g;
B = b;
A = a;

movingUp = false;
movingRight = false;
movingDown = false;
movingLeft = false;
}

void Player::Events(SDL_Event &Event){
if(Event.type == SDL_KEYDOWN){
if(Event.key.keysym.sym == SDLK_w)
movingUp = true;
if(Event.key.keysym.sym == SDLK_d)
movingRight = true;
if(Event.key.keysym.sym == SDLK_s)
movingDown = true;
if(Event.key.keysym.sym == SDLK_a)
movingLeft = true;
}
if(Event.type == SDL_KEYUP){
if(Event.key.keysym.sym == SDLK_w)
movingUp = false;
if(Event.key.keysym.sym == SDLK_d)
movingRight = false;
if(Event.key.keysym.sym == SDLK_s)
movingDown = false;
if(Event.key.keysym.sym == SDLK_a)
movingLeft = false;
}
}

void Player::Update(){
if(movingUp)
Y ++;
if(movingRight)
X ++;
if(movingDown)
Y --;
if(movingLeft)
X --;
}

void Player::Display(){
glBegin(GL_QUADS);

glColor4f(R, G, B, A);

//bottom right
glVertex2f(X+(W/2), Y-(H/2));
//top right
glVertex2f(X+(W/2), Y+(H/2));
//top left
glVertex2f(X-(W/2), Y+(H/2));
//bottom left
glVertex2f(X-(W/2), Y-(H/2));

glEnd();
}

void Player::DisplayWithImage(const char* filename, GLsizei w, GLsizei h){
image = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
(
filename,
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);

glBindTexture(GL_TEXTURE_2D, image);

glBegin(GL_QUADS);

//bottom right
glTexCoord2f(0, 0); glVertex2f(X+(W/2), Y-(H/2));
//top right
glTexCoord2f(0, H); glVertex2f(X+(W/2), Y+(H/2));
//top left
glTexCoord2f(W, H); glVertex2f(X-(W/2), Y+(H/2));
//bottom left
glTexCoord2f(W, 0); glVertex2f(X-(W/2), Y-(H/2));

glEnd();
}

0

Решение

У вас есть три проблемы в вашем коде:

  1. GL_TEXTURE_2D использования нормированный координаты текстуры (0.01,0). Если не H а также W являются 1,0 или меньше вы не хотите использовать их для ваших текстурных координат. Если вы просто хотите растянуть эту текстуру по вашему квадру один раз, используйте 1,0 на месте W а также H,

  2. Наиболее серьезная проблема: Вы создаете новую текстуру в каждом кадре, вам нужно загрузить текстуру один раз, а затем передать дескриптор загруженной текстуры DisplayWithImage (...) вместо того, чтобы эта функция загружала текстуру каждый раз, когда вы вызываете ее.

  3. glOrtho (...) создает орфографический проекция матрица, любая операция GL, которая использует проекционную матрицу изолированно (например, не Проекция * ModelView) не будет работать должным образом, если вы используете матрицу проекции идентичности и матрицу ортографического проецирования для матрицы просмотра модели. Точно так же такие вещи, как освещение вершин, не будут работать должным образом с матрицей проекции, служащей вашей матрицей вида модели …

Вы можете исправить пункт 3, переписав часть кода следующим образом:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(-400, 400, -300, 300, -1, 1);//Set grid for display
~~~~~~~ This should come AFTER you set the matrix mode to projection!
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]