Transparenz - Texturen OpenGl
-
die Textur wird ein Frame oder eine Sekunde angezeigt und ist dann schwarz
Ich vermute mal mit deinem Source stimmt was nicht. Das Verhalten ist nicht normal.
-
hmm, das kann sein, das is seitner Zeit ziemlich langsam das Spiel... so ca. 10 fps bei nem skydome...
naja, ich programmier erstma mal eigenes 3d format ferdig
-
Timm schrieb:
hmm, das kann sein, das is seitner Zeit ziemlich langsam das Spiel... so ca. 10 fps bei nem skydome...
naja, ich programmier erstma mal eigenes 3d format ferdig
Das ist jetzt nicht dein ernst oder?
Du hast Probleme mit Alpha, aber baust ein 3D File Format?
-
Warum? Ich konnte mit DirectX nicht viel anfangen und habe mir damals einen eigenen Bitmaploader programmiert (ich war selber erstaunt das es funktionierte) . Später sogar ein MD2-Fileloader. Und ich konnte damals nicht mal Texturen setzen, weshalb die Objekte nie eine Textur hatten
ehrlich.
-
Das ist jetzt nicht dein ernst oder?
Du hast Probleme mit Alpha, aber baust ein 3D File Format?Ich hab generell Probleme mit OpenGl...
Ich habs nicht so mit Mathematik... von Matrizen hab ich keine Ahnung... ma guggn wann ichs lern...Ein Loader hat nichts mit OpenGl zu tun, eigentlich nur wie man es dann blittet...
-
das Problem ist komischerweise immer nocht nicht weg, schaut euch mal bitte meine Textur-Klasse an:
Texture.cpp:
#include "Texture.h" CTexture::CTexture() { pImage = NULL; iTexture = 0; } CTexture::~CTexture() { iTexture = 0; } bool CTexture::LoadTexture(char *strName) { FILE *File=NULL; if (!strName) { return false; } File=fopen(strName,"r"); if (File) { fclose(File); pImage = auxDIBImageLoad(strName); } if (pImage != NULL && pImage->data != NULL) { glGenTextures(1, &iTexture); glBindTexture(GL_TEXTURE_2D, iTexture); glTexImage2D(GL_TEXTURE_2D, 0, 3, pImage->sizeX, pImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pImage->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); free(pImage->data); free(pImage); } else { return false; } return true; } void CTexture::Use() { glBindTexture(GL_TEXTURE_2D, iTexture); }
Texture.h
#ifndef TEXTURE_H #define TEXTURE_H #include <windows.h> #include <stdio.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> class CTexture { public: void Use(); bool LoadTexture(char *strName); CTexture(); virtual ~CTexture(); private: AUX_RGBImageRec *pImage; GLuint iTexture; }; #endif
Benutzen vielleicht alle CTexture Objekte den gleichen Speicher? Bitte helft mir bin kein Stück weiter gekommen
-
Loescht Du vor jedem Frame auch den Z-Buffer?
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
jap
-
Folgendes zu deinem Source:
Du erstellst für deine Texturen keine MipMaps.
Übersetzt heißt dass, sobald sie weiter weg von der Camera gerendert werden kannst du jede Performance vergessen.
Setze bevor du die Daten dem Treiber übergibts:
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 1);Dass hat aber nichts mit deinem aktuellen Problem zu tun.
die Textur wird ein Frame oder eine Sekunde angezeigt und ist dann schwarz
Wenn du nicht noch eine zweite schwarze Textur geladen hast, bedeutet dass für mich, dass du entweder die 2D-Texturen komplett auschaltest,
dann würde allerdings OpenGLs eigene weiße Textur benutzt, oder du
du eher die Farbe irgendwo auf schwarz gesetzt hast aber nacher nicht wieder auf
weiß gewechselt hast.Füge vor deinem Rendering-Cmds mal ein glColor3f(1.0f, 1.0f, 1.0f) ein.
Achja du kennst nehe.gamedev.net oder?
-
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 1);
ok habs nun doch hinbekommen... ich verzweifel hier gerade wegen folgendes:
Ich hab ein Skydome... gluSphere und nun kann ich darin rumfliegen. wenn ich aus dem Skydome rausfliege sehe ich plötzlich mein Fadenkreuz??? Ich blitte zuerst das Fadenkreuz und dann das Skydome... was passiert da?
Vielleicht liegt es daran das ich kein glOrtho für meine Im-Bildschirm-Elemente benutze... kann mir jemand erklären was für Parameter glOrtho benötigt?Achja du kennst nehe.gamedev.net oder?
Ja ohne die Seite wäre ich jetzt nicht bei OpenGl und noch nicht so weit!
-
Also Transparent ist es nur wenn GL_DEPTH_TEST aus ist, aber wenn ich GL_DEPTH_TEST disable dann verschwindet es hinter allen objekten...
-
Timm schrieb:
Also Transparent ist es nur wenn GL_DEPTH_TEST aus ist, aber wenn ich GL_DEPTH_TEST disable dann verschwindet es hinter allen objekten...
Ist doch kein Wunder wenn Du das Kreuz zuerst blittest?
Ich wuerde alle 2D-Elemente hinterher mit einer Orthogonalprojektion blitten, mit ausgeschaltetem Depthtesting.Beim Alphablending von Texturen wird der Z-Buffer genauso ueberschrieben wie bei Texturen ohne Alphakanal! Wie sollte der Z-Buffer denn sonst sinnvoll benutzt werden bei Halbtransparenz. (Bei Alphatesting ist dies AFAIK nicht so.)
Deswegen wird deine Sphere nicht hinter das Kreuz gerendert, weil das Kreuz dort "den Z-Buffer beherrscht", und das Kreuz erscheint nicht transparent.
-
glDisable(GL_DEPTH_TEST); glOrtho(1.0f,800,600,0.0f,-1.0f,1.0f);
So ists nun richtig oder? Wenn nein was muss ich bei den einzelnen Parametern außer 2 und 3 angeben?! Sry, hab noch nie mit glOrtho gearbeitet...
-
void OrthoMode(int left, int top, int right, int bottom) { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho( left, right, top, bottom, 0, 1 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
So initalisiere ich den Orthogonalen Modus (lol).
void PerspectiveMode() // Set Up A Perspective View { glMatrixMode( GL_PROJECTION ); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); }
So wird er dann wieder zurückgesetzt.
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); Check(); Cam.SetPrespective(); DrawSkyDome(); OrthoMode(0,0,800,600); glTranslatef(0.0f,0.0f,-100.0f); DrawSpeedBar(); DrawEnergyBar(); Cross(); WritingStuff(); PerspectiveMode(); return TRUE; }
Und so blitte ich das ganze dann...
Kann mir jemand helfen? Er blittet zwar das/den(?) Skydome aber dann wars das auch... er initalisiert aber anscheinend nicht den orthogonalen Modus und somit blittet er auch garnichts mehr... ich verzweifel hier gerade...