OpenGl «Sprite» Renderproblem
-
Hallo
Ich habe aktuell eine OpenGL «Sprite» Implementierung, die fast funktioniert. Das Problem besteht aktuell darin, dass ich die erste Sprite nicht auf den Bildschirm bekomme (selbst durch mehrmaliges rendern nicht) eine weitere Sprite mit der selben Textur (nicht nur identisches Bild sondern identischer OpenGL Identifier) auf der selben stelle jedoch problemlos dargestellt wird. (Ein Problem mit irgendwelchen OpenGL states würde ich ausschließen, das sollte ja nur auftreten, wenn ich das «Sprite» zum ersten Mal rendere, mehrmaliges Rendern des ersten Sprites führt aber zu keiner Änderung.
Ich poste im Anschluss meines Erachtens wichtige Source-Ausschnitte und bitte primär um ein paar Tips wie ich den Fehler weiter suchen kann (Minimalbeispiele sind mit Xlib und OpenGL relativ schwehr zu produzieren.
Sprite:
void CSprite::draw() { x11::CWindow * wd = x11::CWindow::get_singleton(); glPushMatrix(); glTranslatef(pos_x_, -pos_y_, 0.0f); glRotatef(angle_, 0.0f, 0.0f, 1.0f); tex_->bind(); glBegin(GL_QUADS); { glTexCoord2f(0.0f, 1.0f); glVertex2i(0 , wd->get_height() - tex_->get_height() ); glTexCoord2f(1.0f, 1.0f); glVertex2i(tex_->get_width() , wd->get_height() - tex_->get_height() ); glTexCoord2f(1.0f, 0.0f); glVertex2i(tex_->get_width() , wd->get_height() ); glTexCoord2f(0.0f, 0.0f); glVertex2i(0 , wd->get_height() ); } glEnd(); glPopMatrix(); } /// \todo (christoph#4#): Implementiere Channel void CSprite::load_texture(const std::string& filename, unsigned channel) { tex_ = static_cast<CTexture*>(CTextureManager::get_singleton()->load_texture(filename)); } void CSprite::free_texture() { CTextureManager::get_singleton()->free_texture(tex_); tex_ = 0; }Texture
CTexture::CTexture(uint8_t * data, unsigned width, unsigned height) : width_(width), height_(height), valid_(true) { glGenTextures(1, &texture_name_); glBindTexture(GL_TEXTURE_2D, texture_name_); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); }ITexture * CTextureManager::load_texture(const std::string& filename) { std::cout << "Texture \""<< filename << "\" requested.\n"; cache_t::iterator it; if ((it = texture_cache_.find(filename)) != texture_cache_.end()) { std::cout << it->second.get() << '\n'; return it->second.get(); } else { std::cout << "Texture \""<< filename << "\" not found, loading.\n"; CImageLoader loader; loader.load_image(filename); std::cout << "Höhe: " << loader.get_height() << " Breite: " << loader.get_width() << '\n'; texture_cache_[filename] = std::tr1::shared_ptr<CTexture>( new CTexture(loader.get_data(), loader.get_width(), loader.get_height())); std::cout << texture_cache_[filename].get() << '\n'; CTexture* dbg = texture_cache_[filename].get(); return texture_cache_[filename].get(); } }Rendering:
main_loop() { CSprite * testn = new CSprite; testn->load_texture("testpng.png", 0); testn->set_pos(55.0, 107.0); sprites_.append(testn); CSprite * test2 = new CSprite; test2->load_texture("down.png", 0); test2->set_pos(55.0, 507.0); sprites_.append(test2); CSprite * test3 = new CSprite; test3->load_texture("down.png", 0); test3->set_pos(555.0, 507.0); sprites_.append(test3); CSprite * test4 = new CSprite; test4->load_texture("down.png", 0); test4->set_pos(555.0, 207.0); sprites_.append(test4); for (;;) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); // Setting Transformation glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, static_cast<double>(wd->get_width()), 0.0, static_cast<double>(wd->get_height()), 4.0, 6.0); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); (*(sprites_.begin()))->draw(); std::for_each(sprites_.begin(), sprites_.end(), Draw<CSprite*>()); GLenum error_code; while ((error_code = glGetError()) != GL_NO_ERROR) { std::cerr << "OpenGL Error" << gluErrorString(error_code) << std::endl; } x11::CWindow::get_singleton()->swap(); } }
-
Das Problem ist immer noch existent.
Hat keiner eine Idee wie man das angehen könnte?
-
Kenne OGL nicht zu gut, aber ich würde jetzt den Fehler nicht direkt hier suchen. Ich würde mal darauf tippen, dass irgendeine Var einen falschen (unerwarteten) Wert hat.
Also ctor, Initialisierung usw. mal anschauen. Dazu wäre es auch noch interessatn,OB überhaupt erfolgreich gerendert wird. Wenn ja, dann solltest du unbedingt mal die Position/Alpha Wert im Auge behalten.
Sonst musst du hald einfach mal Stück für Stück mit dem Debugger drüber und vergleichen, was er macht beim ersten und was beim zweiten..