Wczytywanie plików TGA i zapisywanie Pixeli do pamięci

0

Mam problem mianowicie obrazek czasem jest jak negatyw czasem obrazek z jakby odcieniem niebieskiego.

Może źle rozumiem że po header od razu są pixele ustawione....
samo wczytanie pliku TGA

void LoadTGA(char* src,TGA* TgaFile)
{
	FILE* file;
	file = fopen(src,"rb");
	fread(&TgaFile->header,sizeof(TGA_HEADER),1,file);
	TgaFile->buff = (GLubyte*)malloc(sizeof(GLubyte)*3*TgaFile->header.width*TgaFile->header.height);
	fread(TgaFile->buff,sizeof(GLubyte),3*TgaFile->header.width*TgaFile->header.height,file);
	fclose(file);
}

typedef struct {
   char  idlength;
   char  colourmaptype;
   char  datatypecode;
   short  colourmaporigin;
   short  colourmaplength;
   char  colourmapdepth;
   short  x_origin;
   short  y_origin;
   short width;
   short height;
   char  bitsperpixel;
   char  imagedescriptor;
} TGA_HEADER;
0

Czemu w tagach jest C++, skoro ten kod koło C++ nawet nie leżał?

0

Nie sa to pewne informacje bo w zaden sposob nie testowane, ale:
Z tego co wyczytalem po tej Twojej strukturze (po image descriptor), a mianowicie od bitu 18 jest pole "Image identifiaction". Dlugosc tego bola jest rowna liczbe z pola pierwszego tzn. z bitu 0. Natomiast TY Od razu po wczytaniu struktury, wczytujesz bufor danych, zapominajac tym samym o tym polu.

0

typedef struct?
malloc?
fpolecenia?
Proszę was.

szczególnie pierwsza wymieniona konstrukcja: jest używana w C, by nie trzeba było pisać struct przed nazwą zmiennej.

0

mam coś takiego

	idlength	0 '\0'	char
		colourmaptype	0 '\0'	char
		datatypecode	2 '\x2'	char
		colourmaporigin	0	short
		colourmaplength	0	short
		colourmapdepth	0 '\0'	char
		x_origin	0	short
		y_origin	0	short
		width	800	short
		height	600	short
		bitsperpixel	24 '\x18'	char
		imagedescriptor	0 '\0'	char
glDrawPixels(t.header.width,t.header.height,GL_RGB,GL_UNSIGNED_BYTE,t.buff);

class TGA
{
	public:
		TGA_HEADER header;
		GLubyte* buff;

		~TGA()
		{
			delete buff;
		}
};
1

Oczywiscie to [CIACH!] byla:
zamien: GL_RGB na GL_BGR.

  • dzialajcy kod:
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <cstdio>
#include <cstdlib>

GLubyte buf[3*512*512];

bool init()
{
	if(SDL_Init(SDL_INIT_EVERYTHING))
		return false;
	if(SDL_SetVideoMode(512, 512, 24, SDL_OPENGL | SDL_DOUBLEBUF))
		return false;

	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_BUFFER_SIZE, 24);

	glViewport(0.0f, 0.0f, 800, 600);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0f, 800, 600, 0.0f, 1.0f, -1.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	if(glGetError() != GL_NO_ERROR)
		return false;

	return true;
}

void load()
{
	FILE* file = fopen("fire.tga", "rb");
	GLubyte tmp[18];
	fread(tmp, 18, 1, file);
	fread(buf, sizeof(GLubyte), 3*512*512, file);
	fclose(file);
}

void draw()
{
	glDrawPixels(512, 512, GL_BGR, GL_UNSIGNED_BYTE, buf);
}

int main()
{
	init();
	load();
	draw();
	SDL_GL_SwapBuffers();
	SDL_Delay(5000);
	return 0;
}
0

Dzieki wybawco. Faktycznie doczytałem i zauważyłem ze pisze ze jest inna kolejność ale nie miałem " GL_BGR" żeby sprawdzic

1 użytkowników online, w tym zalogowanych: 0, gości: 1