Seite 1 von 1

Enviroment Cube Mapping

Verfasst: 12.05.2011, 11:11
von Jonathan
Also ich möchte Enviroment CubeMapping mit OpenGL machen. Die Theorie klingt auch sehr einfach, aber es scheitert am Detail.

Es fängt schon damit an, dass manche Quellen behaupten, man bräuchte für jede der 6 Texturen ein Texture Object und andere meinen, 1 für alle würde reichen...

Hier mal ein wenig Code:

Textur laden:

Code: Alles auswählen

void LoadTextureInObject(GLuint TextureObject, QString Filename, GLenum Target)
{
	//do some serious texture loading:
	QImage Image;

	if(!Image.load(Filename))
	{
		std::cout << Filename.toStdString() << " couldn't be loaded... :(\n";
		return;
	}

	glBindTexture(Target, TextureObject);

	QGLWidget::convertToGLFormat(Image);

	glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);


	gluBuild2DMipmaps(Target, 4, Image.width(), Image.height(), GL_RGBA, GL_UNSIGNED_BYTE, Image.bits());
}

Code: Alles auswählen

void GlSphere::Init()
{
	glGenTextures(1, &m_CubeMap);
	LoadTextureInObject(m_CubeMap, "images/wall.png", GL_TEXTURE_CUBE_MAP_POSITIVE_X);
	LoadTextureInObject(m_CubeMap, "images/wall.png", GL_TEXTURE_CUBE_MAP_NEGATIVE_X);
	LoadTextureInObject(m_CubeMap, "images/sky.png", GL_TEXTURE_CUBE_MAP_POSITIVE_Y);
	LoadTextureInObject(m_CubeMap, "images/floor.png", GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
	LoadTextureInObject(m_CubeMap, "images/wall.png", GL_TEXTURE_CUBE_MAP_POSITIVE_Z);
	LoadTextureInObject(m_CubeMap, "images/wall.png", GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);

	//glBindTexture(GL_TEXTURE_CUBE_MAP, m_CubeMap);
}

void GlSphere::Render()
{
	glDisable(GL_TEXTURE_2D);
	for(int i=0; i<6; ++i)
		glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X+i, m_CubeMap);

	glColor3f(1, 1, 1);
	
	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);

	glEnable(GL_TEXTURE_GEN_S);
	glEnable(GL_TEXTURE_GEN_T);
	glEnable(GL_TEXTURE_GEN_R);
	glEnable(GL_TEXTURE_CUBE_MAP);

	//Primitiven zeichnen blabla...
	
	glDisable(GL_TEXTURE_GEN_S);
	glDisable(GL_TEXTURE_GEN_T);
	glDisable(GL_TEXTURE_GEN_R);
	glDisable(GL_TEXTURE_CUBE_MAP);
}
DIe Spiegelung auf der Kugel sieht schon richtig aus, allerdings ändert sie sich nicht, wenn ich die Kamera drehe; was ziemlich albern aussieht. Was würde man dagegen machen? Ich schätze mal, OpenGL muss ja auch irgendwie zwischen Kamera und Objekttransformation unterscheiden, nur wie macht es das, wenn es nur eine ModelViewMatrix gibt? Es muss dann ja eigentlich die aktuelle ModelViewMatrix nehmen, in der dann nur die Kamrea ist, bevor ich mein Objekt transformiere, doch mit welchem Aufruf genau macht es das?

Re: Enviroment Cube Mapping

Verfasst: 12.05.2011, 15:09
von Jonathan
Hab mal meine neuen Erkenntnisse reineditiert...

Re: Enviroment Cube Mapping

Verfasst: 12.05.2011, 16:35
von joggel
Wäre es möglich das man etwas mit der TexturMatrix des Objektes machen muss?
Link

Re: Enviroment Cube Mapping

Verfasst: 12.05.2011, 17:45
von Jonathan
Jep, hab das selbe gerade auch gefunden:
"OpenGL's texture matrix is also very useful for manipulating cube map texture coordinates. The texture matrix can be used to rotate an (s,t,r) vector from one space to another. For example, if your cube map texture is oriented in world coordinate space, and M is the matrix transform that moves from world coordinates to eye coordinates, you can load the inverse of the affine portion of M into the texture matrix to rotate the eye-space reflection or normal vectors generated by GL_REFLECTION_MAP_EXT or GL_NORMAL_MAP_EXT back into world space."
Jetzt gehts, thx