Brauche dringend Hilfe beim ersten OpbenGL Dreieck!
-
Hallo,
ich habe folgendes Problem:
ich habe mithilfe eines Buches versucht ein Fenster in Windows zu erzeugen um da ein einfaches Dreieck zu Rendern. Ich habe dazu die Funktionen:glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity (); glTranslatef (0.0, 0.0, -2.7f); glColor4f (0.0f, 0.7f, 0.1f, 0.2f); glBegin(GL_TRIANGLES); glVertex3f (1.0, -1.0, 0.0); glVertex3f (-1.0, -1.0, 0.0); glVertex3f (0.0, 1.0, 0.0); glEnd ();benutzt.
Im Fenstermodus klappt alles wunderbar, sobald ich aber im Fullscreen modus bin, zeichnet er keine Koordinaten die kleiner sind als -1.0f (in der Z Achse).
Das heißt sobald ich in der Funktion : glTranslatef (0.0, 0.0, -2.7f); das dritte Argument kleiner als -1.0 habe - sehe ich nichts.Woran kann das liegen??? bin schon seit 2 Tagen bei habe alle möglichen Werte verstellt und nichts erreicht..
Danke im Voraus.
P.S. : Wenn sich jemand bereit erklärt sich den ganzen Code anzusehen, würde ich die einzelnen files gerne Verschicken.
-
Schau mal hier nach :
www.joachimrohde.comWenn du da, aber auch wirklich da nichts findest, bin ich bereit dir zu helfen ;-).
-
Vielen Dank für den Link. Endlich gute Information in deutsch.
Aber vielleicht weißt schon wo mein Prob liegt..?
Hat es was mit dem Depth Buffer zutun... oder ist die Projection falsch... (ich habe die genauso wie im Buch).Nochmal der Hinweis: der Fehler liegt nur im FullscreenModus vor.
-
ich vermute mal, dass dir grundlagenverstaendnis fehlt.
arbeite doch einfach die tutorials durch, dann muessen wir nicht so viel schreiben
-
Wechselst du irgendwelche Einstellungen wenn du in den Fullscreenmodus wechselst?
Setzt du vielleicht Viewport oder so neu?lg, bloodycross
-
Ich setze den Vieport beim der message WM_SIZE neu.
und mir fehlt tatsächlich das Grundlagenverständnis, weswegen ich mit dem ersten Kapitel angefangen habe und nur ein simples Dreieck zeichnen will.
Mir ist übrigens noch etwas aufgefallen:
Wenn ich die Z Achse zwichen 1.0 und -1.0 setze bleibt das Dreieck immer auf der gleichen stelle ich schätze mal auf NULL, da es genau über die Ecken des Schirms verläuft.
-
Du setzt den Viewport also beim ändern der Fenstergröße neu? Vermutlich also auch beim Wechseln in den Vollbildmodus?
Könntest du deinen Code dafür posten?
lg, bloodycross
-
na klar kann ich das.
Hier der code aus der WinProc Funktion und InitWindow für den fullscreen.
Wenn du lust hast kann ich dir auch den ganzen Code per mail schicken.#include "C_GLWindow.h" //ACHTUNG WndProc ist eine friend Funktion der C_GLWindow Klasse ACHTUNG// //definitition of the WindowProcedure// LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //create object "window" on heap memory// C_GLWindow *window = new C_GLWindow; switch (uMsg) { case WM_SIZE: window->setWindowSize(LOWORD (lParam), HIWORD (lParam)); //if size change, overwrite old velues window->SetupProjection (); //and reset the Projection break;und hier der code von SetupProjection:
//set the projection Matrix// void C_GLWindow::SetupProjection () { glViewport(0, 0, width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerspective (50.0, (GLfloat) width / (GLfloat) height, 0.01f, 1000.0f); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); }hier nochmal ein Ausschnitt aus der InitWindow funktion, in diesem abschitt mache ich alle Fullscreen einstellungen.
if(fullscreen != 0) { DEVMODE dm; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm); dm.dmSize = sizeof(DEVMODE); dm.dmPelsWidth = width; dm.dmPelsHeight = height; dm.dmBitsPerPel = 32; ChangeDisplaySettings(&dm, CDS_FULLSCREEN); dwStyle = WS_POPUP; dwExStyle = WS_EX_APPWINDOW; } AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle);einen Ausschnitt noch... undzwar sind hier die Pixelformateinstellungen, vieleicht fehlt hier ja was für den fullscreen?:
int C_GLWindow::SetupPixelformat (HDC hDC) { unsigned int PixelFormat = 0; PIXELFORMATDESCRIPTOR pfd; pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_SUPPORT_OPENGL|PFD_DRAW_TO_WINDOW|PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; //durch member ersetzten pfd.cBlueBits = 8; //durch member ersetzten pfd.cGreenBits = 8; //durch member ersetzten pfd.cRedBits = 8; //durch member ersetzten pfd.cAlphaBits = 8; //durch member ersetzten pfd.cAlphaShift = 0; //durch member ersetzten pfd.cDepthBits = 24; // durch member ersetzen pfd.iLayerType = PFD_MAIN_PLANE; pfd.cAccumAlphaBits = 0; //durch member ersetzten pfd.cAccumBits = 0; //durch member ersetzten pfd.cAccumBlueBits = 0; //durch member ersetzten pfd.cAccumGreenBits = 0; //durch member ersetzten pfd.cAccumRedBits = 0; //durch member ersetzten pfd.cAlphaShift = 0; //durch member ersetzten pfd.cAuxBuffers = 0; //durch member ersetzten pfd.cGreenShift = 0; //durch member ersetzten pfd.cRedShift = 0; //durch member ersetzten pfd.cStencilBits = 0; //durch member ersetzten pfd.dwDamageMask = 0; //durch member ersetzten pfd.dwLayerMask = 0; //durch member ersetzten pfd.dwVisibleMask = 0; //durch member ersetzten pfd.bReserved = 0; PixelFormat = ChoosePixelFormat(hDC, &pfd); if(!PixelFormat) { MessageBox(mainhWnd, _T("Failed to choose pixel format."), _T("ERROR"), MB_OK); return 0; } SetPixelFormat(hDC, PixelFormat, &pfd); return 1; }einen Hinweis noch: ich kann mit der funktion gl_Translatef die Werte der X und der Y Achse größer als 1.0 Wählen. Komisch ist auch das ein Positiver Z Wert (bis 1.0) das dreieck nicht verschwinden lässt obwohl das Dreieck ja in diesem fall noch vor dem betrachter steht.
Was mir noch aufgefallen ist: Wenn ich gl_Tranlsatef auskommentiere und z.B den oberen Eckpunkt bei glVertex3f (0.0, 1.0, -1.1);setze dann verschwindet nur ein Stück von der oberen Spitze...???
ich dachte es könnte vieleicht irgenwie mit dem Depth Buffer zusammenhängenaufjedenfall vielen dank für den Zeitaufwand...