Enviroment Cube Mapping
Verfasst: 12.05.2011, 11:11
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:
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?
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);
}