OpenGL BLP-Texturen

Cromon

Erfahrenes Mitglied
Hallo miteinander!

Nachdem ich nun mein Treiberproblem gelöst habe bin ich nun sozusagen ermächtigt mich an die Texturen meiner Modelle zu erstellen. Da ich selbst nicht über die nötigen Fertigkeiten verfüge Modelle und Texturen zu erstellen habe ich hier aus den Spielen von Blizzard Entertainment mich an die .m2-Modelle und BLP-Texturen hingewagt.

Modelle sind bisher kein Problem, wird alles tiptop gerendert, halt einfach nur in weiss. Nun habe ich mich an die Texturen gemacht und egal was ich versuche, die Modelle bleiben und bleiben einfach nur weiss.

Ich habe hier mal ein paar Codeausschnitte:
Code:
for(ui32 i = 0; i < m_header.nTextures; ++i)
	{
		char name[255];
		strncpy(name, (char*)m_buffer + (m_textures + i)->nameOfs, (m_textures + i)->nameLen);
		textures[i] = CTextureHandler::GetInstance()->AddBlpTexture(name);
	}

Hier die Funktion AddBlpTexture:
Code:
GLuint CTextureHandler::AddBlpTexture(std::string texName)
{
	if(texName == "")
		return 0;
	GLuint saved = m_textures[texName];
	if(saved)
		return saved;
	saved = LoadFromBlp(texName);
	m_textures[texName] = saved;
	return saved;
}

Und entsprechend LoadFromBlp
Code:
GLuint CTextureHandler::LoadFromBlp(std::string texName)
{
	MPQFile file(texName);
	if(file.IsOpened())
		printf("Opened texture '%s'\n", texName.c_str());
	else
	{
		printf("Could not open texture '%s'\n", texName.c_str());
		return 0;
	}

	char sig[4];
	int w, h, version;
	ui32 offsets[16], sizes[16];
	ui8 compression, alphadepth, alphaencoding, hasMipMap;

	file.ReadInc(sig, 4);
	file.ReadInc(&version, 4);
	file.ReadInc(&compression, 1);
	file.ReadInc(&alphadepth, 1);
	file.ReadInc(&alphaencoding, 1);
	file.ReadInc(&hasMipMap, 1);
	file.ReadInc(&w, 4);
	file.ReadInc(&h, 4);
	file.ReadInc(offsets, 4 * 16);
	file.ReadInc(sizes, 4 * 16);

	ui32 format;
	ui8 blocksize;
	GLuint id = 0;
	glGenTextures(1, &id);
	glBindTexture(GL_TEXTURE_2D, id);

	if(version == 1)
	{
		if(compression == 2) // DXT3 or DXT5
		{
			switch(alphaencoding)
			{
			case 0: // DXT1
				format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
				blocksize = 8;
				break;
			case 4: // DXT2/3
				format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
				blocksize = 8;
				break;
			case 7: // DXT4/5
				format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
				blocksize = 16;
				break;
			}

			ui8* buffer = new ui8[sizes[0]];
			for(ui8 i = 0; i < 16; ++i)
			{
				if(!w) w = 1;
				if(!h) h = 1;
				if(sizes[i] && offsets[i])
				{
					file.Read(buffer, offsets[i], sizes[i]);
					ui32 size = ((w + 3) / 4) * ((h + 3) / 4) * blocksize;
					glCompressedTexImage2DARB(GL_TEXTURE_2D, i, format, w, h, 0, size, buffer);
				}
				else
					break;
				w >>= 1;
				h >>= 1;
			}
		}
	}

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

	return id;
}

Beim Rendern geschieht nun folgendes:
Code:
for(ui32 i = 0; i < m_passes.size(); ++i)
	{
		M2ModelPass p = m_passes[i];

		float mat[4] = { 0 };

		glPushName(p.texture);
		glBindTexture(GL_TEXTURE_2D, p.texture);

		glMaterialfv(GL_FRONT, GL_EMISSION, mat);
		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

		glBegin(GL_TRIANGLES);
		for(ui32 j = 0, t = p.indexStart; j < p.indexCount; ++j, ++t)
		{
			ui16 ind = indices[t];
			glNormal3f(normals[ind].x, normals[ind].y, normals[ind].z);
			glTexCoord2f(m_vertices[ind].texturecoords[0], m_vertices[ind].texturecoords[1]);
			glVertex3f(m_vertices[ind].x, m_vertices[ind].y, m_vertices[ind].z);
		}
		glEnd();

		glPopName();
	}

Leider hat das ganze wie oben beschrieben keinen Effekt auf das gerenderte Modell!

Sieht jemand zufällig, was ich da falsch mache (meine Erfahrung mit OpenGL beläuft sich mittlerweile auf etwa 3 oder 4 Tage :p)?

Gruss
Cromon
 
Zuletzt bearbeitet:
Hach ja, wie gut doch Schüsse ins Blaue sein können. *sich selbst geissel*

Danke dir, Matthias!

Gruss
Cromon
 
Zurück