OpenGL - funkcja

OpenGL - funkcja
G6
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:6
0

Mam pytanko odnośnie jednej z funkcjonalności OpenGL, a dokładniej o jedną z funkcji.
Mianowicie - funkcja glBufferData pozwala nam na przesłanie tablicy do pamięci gpu. A co jeśli chcemy przesłać teksturę? Jakiej funkcji należy użyć? Mógłby ktoś podać przykładową składnię?

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

wrzuce kawalek kodu z http://4programmers.net/Forum/Edukacja/232269-age_of_demons ;)

Kopiuj
 #pragma once
#include <string>
#include "SpriteTypes.h"
#include "SDL2\include\SDL.h"

namespace Graphics
{
	class Sprite
	{
	public:
		Sprite(const std::string& path, int priority, SDL_Rect rect);
		Sprite(const std::string& path, int priority, int x, int y, int w, int h);
		Sprite(int priority, SDL_Rect rect, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
		Sprite(const std::string& text, const std::string& path, int priority, int x, int y, int w, int h);
		~Sprite();

		Common::SpriteType type;
		const std::string path;
		const std::string text;
		int priority;
		SDL_Rect rect;
		Uint8 r, g, b, a;
	};
} 
Kopiuj
void Engine::addSprite(Sprite sprite)
{
	std::list<Sprite>::iterator it;
	if(sprite.type == SPRITE)
	{
		if(!(texturesInMemory.count(sprite.path)))
		{
			texturesInMemory[sprite.path] = loadTexture(sprite.path);
		}
	}
	else if (sprite.type == TEXT)
	{
		if (!(texturesInMemory.count(sprite.text)))
		{
			texturesInMemory[sprite.text] = loadText(sprite.text, sprite.path);
		}
	}
	for(it = sprites.begin(); it != sprites.end(); ++it)
	{
		if(it->priority >= sprite.priority)
		{
			break;
		}
	}
	sprites.insert(it, sprite);
} 
Kopiuj
 int Common::loadTexture(const std::string& path)
{
	std::shared_ptr<SDL_Surface> texture(
		IMG_Load(path.c_str()), 
		[](SDL_Surface* surface){SDL_FreeSurface(surface);});
	GLuint object = 0;
	glGenTextures(1, &object);
	glBindTexture(GL_TEXTURE_2D, object);
	int mode = GL_RGB;
	if (texture->format->BytesPerPixel == 4)
	{
		mode = GL_RGBA;
	}
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, mode, texture->w, texture->h, 0, mode, GL_UNSIGNED_BYTE, texture->pixels);
	return object;
}

int Common::loadTexture(std::shared_ptr<SDL_Surface> texture)
{
	GLuint object = 0;
	glGenTextures(1, &object);
	glBindTexture(GL_TEXTURE_2D, object);
	int mode = GL_RGB;
	if (texture->format->BytesPerPixel == 4)
	{
		mode = GL_RGBA;
	}
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, mode, texture->w, texture->h, 0, mode, GL_UNSIGNED_BYTE, texture->pixels);
	return object;
}

int Common::loadText(const std::string& text, const std::string& path)
{
	std::shared_ptr<TTF_Font> font(
		TTF_OpenFont(path.c_str(), 32), 
		[](TTF_Font* f){TTF_CloseFont(f); });
	SDL_Color color = { 0, 0, 0, 255 };
	std::shared_ptr<SDL_Surface> textSurface(
		TTF_RenderText_Blended(font.get(), text.c_str(), color),
		[](SDL_Surface* s){SDL_FreeSurface(s);});
	return loadTexture(textSurface);
}
Kopiuj
 void Engine::draw(Uint32 ticks)
{
	glClearColor(0, 0, 0, 1);
	glClear(GL_COLOR_BUFFER_BIT);

	for(Sprite sprite : sprites)
	{
		float x = static_cast<float>(sprite.rect.x) / (windowWidth / 2),
			y = static_cast<float>(sprite.rect.y) / (windowHeight / 2),
			w = static_cast<float>(sprite.rect.w) / (windowWidth / 2),
			h = static_cast<float>(sprite.rect.h) / (windowHeight / 2);
		float x1 = x,
			x2 = x + w,
			y1 = -y,
			y2 = -h-y;
		glLoadIdentity();
		glTranslatef(-1.0f, 1.0f, 0);
		if(sprite.type == SPRITE || sprite.type == TEXT)
		{
			if (sprite.type == SPRITE)
				glBindTexture(GL_TEXTURE_2D, texturesInMemory[sprite.path]);
			else
				glBindTexture(GL_TEXTURE_2D, texturesInMemory[sprite.text]);
			glBegin(GL_QUADS);
				glTexCoord2f(0, 0);
				glVertex3f(x1, y1, 0);
				glTexCoord2f(1, 0);
				glVertex3f(x2, y1, 0);
				glTexCoord2f(1, 1);
				glVertex3f(x2, y2, 0);
				glTexCoord2f(0, 1);
				glVertex3f(x1, y2, 0);
			glEnd();
		}
		else if (sprite.type == RECTANGLE)
		{
			glDisable(GL_BLEND);
			glPushAttrib(GL_CURRENT_BIT);
			glColor4ub(sprite.r, sprite.g, sprite.b, sprite.a);
			glBegin(GL_QUADS);
				glVertex3f(x1, y1, 0);
				glVertex3f(x2, y1, 0);
				glVertex3f(x2, y2, 0);
				glVertex3f(x1, y2, 0);
			glEnd();
			glPopAttrib();
			glEnable(GL_BLEND);
		}
	}
	SDL_GL_SwapWindow(mainWindow.get());
}

przeanalizuj i powinienes wiedziec jak napisac to co chcesz ;)

edytowany 2x, ostatnio: fasadin
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@fasadin nie że sie czepiam czy coś, ale co byś zrobił jakby różnych typów Spritów było 10? Albo 100? Też na bazie enuma i ifów? :D Czemu te różne rodzaje to nie są klasy dziedziczące ze Sprite? I czemu logika "malowania" danego Sprite nie jest zamknięta w jego własnej implemetnacji? Chciałbym zobaczyć to draw() jak będzie 100 typów Sprita :D


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostały 1 komentarz
Shalom
ale nie bedzie wiecej typu... ile razy ja to słyszałem :D albo nie będzie już żadnych dodatkowych warunków albo przewidzieliśmy wszystkie specjalne przypadki :D :D
n0name_l
Potem przychodzi ladna pani od biznesu, grzecznie proszac o dodanie checkboxa. Na co caly team programistow zamarl. :D http://i.imgur.com/axHpcVZ.png
fasadin
wiesz jak jest ;) Na pewno jezeli kod zacznie rozrastac sie z ifami, to zmienimy architekture w tym miejscu ;) Nie ma co za wczesnie optymalizowac kodu. Poki co dodajemy duzo feature'ow ;) pozniej przejrzymy kod jeszcze z 5 razy i sie zastanowimy co mozna ulepszyc ;) Dobrze ze nie widziales niektorych rzeczy sprzed 3-4 miesiecy :D bo bys juz pewnie sie do mnie nie odezwal :D Na wszystko jest czas ;) Niektore rzeczy musza dojrzec :D W ogole nadal nie jestem glodny a wczoraj nie bylem w stanie nawet siedziec :D
Shalom
A kto ci się kazał tak objadać? :P Ja rozumiem ze jak już zapłaciłeś to nie chciałeś żeby się zmarnowało, ale... :P :P
fasadin
jestem ekonomiczny :D Jem raz na dwa dni :DDD. Ledwo doszedlem wczoraj do domu, ten ryz byl coraz wiekszy i wiekszy i wiekszy ;D A spalem jak niemowle ;) (w sumie zjadlbym te pierozki jeszcze teraz, dobre byly :D)
MA
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 3 lata
  • Postów:166
0

To co podał @fasadin to jest OpenGL z ubiegłego wieku ;). @greedy624 weź dowolny tutorial, który omawia ładowanie tekstur w nowym OGL, o którego zapewne ci chodzi.

Azarien
osobiście jestem wrogiem "nowego" OpenGL-a, bo: 1. niesamowicie komplikuje rzeczy które były proste, 2. intel w swoich Graphics Media Deceleratorach dawał sterowniki tylko 1.x/2.x (przynajmniej do niedawna) a dla mnie kompatybilność jest ważniejsza niż „nowość”.
n0name_l
Dopoki sie nie tworzy duzych produkcji to nowy OpenGL wprowadza same problemy, nie dajac nic w zamian. http://4programmers.net/Forum/839331

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.