PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum wird wglMakeCurrent false ?


Lord Nikon
2003-06-18, 17:33:51
Hier ist mein Programm das mit VS 6.0 und OpenGl programmiert wurde

// OpenGL.cpp: Implementierungsdatei
//

#include "stdafx.h"

#include "OGLProjekt.h"
#include "OpenGL.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COpenGL

IMPLEMENT_DYNCREATE(COpenGL, CFrameWnd)

COpenGL::COpenGL()
{
}
/*
COpenGL::~COpenGL
{
HGLRC hglrc=wglGetCurrentContext(); //akutellen Render Context holen
wglMakeCurrent(NULL,NULL); // deaktivieren
wglDeleteContext(); //löschen
}
*/

BEGIN_MESSAGE_MAP(COpenGL, CFrameWnd)
//{{AFX_MSG_MAP(COpenGL)
// HINWEIS - Der Klassen-Assistent fügt hier Zuordnungsmakros ein und entfernt diese.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten COpenGL

BOOL COpenGL::InitOpenGL()
{
// Diese Routine dient der Initialisierung von OpenGL und das Fenster muss als Child deklariert werden
if (Create ( //CFrameWnd::Create Methoide aufrufen
NULL, // Klassename über AFX-Msg
"OpenGl Fenster", //Fenstertitel
WS_CLIPCHILDREN // Fensterstil/-Eigentschaften
| WS_CLIPSIBLINGS,
CRect(0,0,400,400), //Fensterposition & Gräße
NULL, //KEIN ELternfenster
NULL, // Kein DialogMenu
WS_EX_TOPMOST, // Erweitere Fensterstile
NULL)) //kein ZeigerCreateContext
{ //Create war Erfolgreich
// eitere Initialisierungen folgn
if (!SetRenderingContext())
{
return false;
MessageBox("RENDERING CONTEXT FEHLGESCHLAGEN","TEST",MB_ICONWARNING);
}
return true;
};
return false;

}


BOOL COpenGL::SetRenderingContext()
{
CDC* pcdc=GetDC();
HDC hdc=pcdc->m_hDC;

// In der Funktion wird der Render-Kontext RC mit dem Device Kontet ds OpenGl Fenster verbunden
PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // Größe der Struktur
1, //7 Versionnummer,
PFD_DRAW_TO_WINDOW // Draw Sryle=Puffer To Window
|PFD_DRAW_TO_BITMAP // Puffer To Bitmap nutzen
|PFD_SUPPORT_OPENGL // Opengl Grafik unterschützen
|PFD_DOUBLEBUFFER, // Doppelpuffer nutzne
PFD_TYPE_RGBA, // RGBA Modus nutzen (Pixeltype=
32, // Farbetiefen
0,0,0,0,0,0, // Farb Bits
0,0, //Alpha Bits
0,0,0,0,0, // Accumulatons Bit
16, // 16-Bit z-Tiefenpuffer
0, // Stencil Puffer
0,// Auxiiary-Puffer
0,// Layertyp &(altes OGL Version)
0,//Overlay
0,// Layer-Mask (alte OGL Version)
0,// Transparenz UnderlayPlan
0
};
int iPixelFormat=ChoosePixelFormat(hdc,&pfd);
SetPixelFormat ( //PIXELFORMAT SETZEN
hdc, //IST DER HANDLE
iPixelFormat, //PIXELFORMAT
&pfd); // Z&EIGER AUF STRUKTUR
HGLRC hglrc= // Render Context für OGL erzeugen
wglCreateContext(hdc); // über DC Handle
if (hglrc=NULL) return FALSE; //FEHLER
if (!wglMakeCurrent( // akt. RC-DC verbindung setzen
hdc,
hglrc)) return FALSE;
return true; // Alles OK


}





BOOL COpenGL::HelloOpenGL()
{
CRect clientRect; // MFC_Rechteck
GetClientRect(&clientRect); // Fensterinfo holen
GLsizei width=
(GLint) clientRect.right; // Pixel-Breite des Fenster-Zeichenbereichs
GLsizei height=
(GLint) clientRect.bottom; //Pixel-Breite des Fenster-Zeichenbereichs
GLdouble ClientRatio=
(GLdouble) width/height;
GLdouble ClipSize=0.8;

// OGL-Initialisierung (BS-abhängig)
if (wglMakeCurrent( //aktueller WIndows OpenGl-Verbindung setzem
wglGetCurrentDC(), // aktuellen DC holen
wglGetCurrentContext())==TRUE)
{
MessageBox("Der Context wurde erfolreich eingerichtert","Nitt",MB_OK);
}
else
{
MessageBox("FHLER","FEHLER",MB_ICONWARNING);
}

// aktuellen RC holen

// PROJEKTIONSMATRIX
glMatrixMode(GL_PROJECTION); // akutelle MATRIX setzen
glLoadIdentity(); // und mit Einheitsmatrix initialen
// Clopebenen Blickfeld definieren
glOrtho ( //VORZEICHEN SIND STANDARTWERTE
-ClipSize,// LINKE CLIPPLANE,
+ClipSize, // RECHTE CLIPPlane

-ClipSize, //OBERE CLIPPLANE
+ClipSize, //UNERE CLIPPLANE

-ClipSize*100.0, //VODERE CLIPPLANBE
+ClipSize*100.0); //HINTERE CLIPPLANE

glRotated(-65.0,1.0,0.0,0.0); //SZENEN UM X DREHEN
glRotated(-75.0,0.0,0.0,1.0); //SZENEN UM Y DREHEN
glTranslated(-2.5,0.0,-1.4); // SZENE in X,Y Verschieben
glViewport( // Darstellungsbereich
(GLint) 0,
(GLint) 0,
(GLint) width,
(GLint) height);
// MODELLIERUNGSMATRIX
glMatrixMode(GL_MODELVIEW); // aktuelle Matrix setzen
glLoadIdentity();
glClearColor(1.0F,1.0F,1.0F,1.0F); // HINTERGRUNDFARBE WEIß
glClear(GL_COLOR_BUFFER_BIT | // Farb-Puffer löschen
GL_DEPTH_BUFFER_BIT); // F Puffer löschen

// DARSTELLUNGS-//STEUERUNGSARTEN
// Definition des Open-Status
glEnable(GL_NORMALIZE); // einheitsvektorbildung EIN
glEnable(GL_DEPTH_TEST); // Z-Buffer Test
glEnable(GL_COLOR_MATERIAL); // Materialfarbgebungsart
glEnable(GL_LIGHT0); // Lichtquelle 0 Ein
glEnable(GL_LIGHTING); // OpenGl -Lichteffekte EIN
glDisable(GL_CULL_FACE);
// KORRESPONDIEREN STATUS-Befehler

// LICHTEFFEKTE definiren
//BENÖTIGTE VARIAVLEN
//ZUM LICH(L)
// Def 1.Lichqzelle
GLfloat LPosition[4]=
{
1.0F,1.0F,1.0F,0.0F};
//def 2.n Lichrquelle

//benötigte Open Gl
// zum Licht
//def 1 Lichquelle
glLightfv(GL_LIGHT0,GL_POSITION,&LPosition[0]);
///def 2 LIchtquelle

// Gloabale Belichtung

GLfloat LModelAmbient[4]
={0.2F,0.2f,0.2F,1.0F};
//GL Befehle zur Beleuchtung

glLightModelfv(
GL_LIGHT_MODEL_AMBIENT,
&LModelAmbient[0]);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
glColorMaterial( //FARBE
GL_FRONT, //Nur Vorseeiten einfärben
GL_AMBIENT_AND_DIFFUSE); // Ambientes u diffuses Licht

// Szenenobejeke zeichnen
// Sklare Eckpunkte definieren
//DACHPUNKTE
GLdouble x1=0.75,y1=0.50,z1=0.50; //v1
GLdouble x2=0.75,y2=0.25,z2=0.25;
GLdouble x3=0.75,y3=0.75,z3=0.25;
GLdouble x4=0.26,y4=0.25,z4=0.25;
GLdouble x5=0.25,y5=0.25,z5=0.25;
GLdouble x6=0.25,y6=0.75,z6=0.25; // bis v6 komponenten
// der Hausgrundseite
GLdouble x10=0.70,y10=0.30,z10=0.0;
GLdouble x11=0.70,y11=0.70,z11=0.0;
GLdouble x12=0.70,y12=0.70,z12=0.25;
GLdouble x13=0.70,y13=0.30,z13=0.25;
GLdouble x14=0.30,y14=0.30,z14=0.0;
GLdouble x15=0.30,y15=0.70,z15=0.0;
GLdouble x16=0.30,y16=0.70,z16=0.25;
GLdouble x17=0.30,y17=0.30,z17=0.25;
// Grundstück zeichnen
glBegin(GL_QUADS); //VIERECKS -Fläche
glNormal3d(0.0,0.0,1.0); //normal Vektor
glColor4f(0.0F,0.5F,0.0F,1.0F); // Farbe Dunkelgrün
glVertex3d(0.1,0.1,0.0); // hinten links nach
glVertex3d(0.9,0.9,0.0); // vorne links nach
glVertex3d(0.9,0.9,0.0); //vorne rechts nach
glVertex3d(0.1,0.9,0.0); // hinten rechts
glEnd();
//Erdgeschoß
glBegin(GL_QUADS);
glColor4f(1.0F,1.0F,1.0F,0.2F);// Farbe weiß
glNormal3d(-1.0,0.0,0.0); //
glVertex3d(x14,y14,z14);//V14
glVertex3d(x17,y17,z17);//Nach V17
glVertex3d(x15,y15,z15);// v15
glVertex3d(x16,y16,z16); //nach v15
glNormal3d(0.0,-1.0,0.0); // Normalenvektor
glVertex3d(x10,y10,z10); //V10 nach
glVertex3d(x13,y13,z13);// V 17 nach
glVertex3d(x17,y17,z17);// V 17 nach
glVertex3d(x14,y14,z14); // V14


glNormal3d(+1.0,0.0,0.0);
glVertex3d(x10,y10,z10); // von x10 nach x11
glVertex3d(x11,y11,z11); // x11 nach
glVertex3d(x12,y12,z12);//x12 nach
glVertex3d(x13,y13,z13);//x13
glEnd();
//Dachvorder-und hunterseite
glBegin(GL_TRIANGLES); //DREICKE
glColor4f(10.0F,0.0F,0.0F,0.2F); //ROT
glNormal3d(1.0,0.0,0.0);
glVertex3d(x1,y1,z1);
glVertex3d(x2,y2,z2);
glVertex3d(x3,y3,z3);

glNormal3d(-1.0,0.0,0.0);
glVertex3d(x4,y4,z4);
glVertex3d(x6,y6,z6);
glVertex3d(x5,y5,z5);
glEnd();

glBegin(GL_QUADS);
glColor4f(1.0F,0.0F,0.0F,0.2F); //FARBE ROT
glNormal3d(0.0,10.0,1.0);
glVertex3d(x1,y1,z1);
glVertex3d(x3,y3,z3);
glVertex3d(x6,y6,z6);
glVertex3d(x4,y4,z4);

glNormal3d(0.0,-1.0,1.0);
glVertex3d(x1,y1,z1);
glVertex3d(x4,y4,z4);
glVertex3d(x5,y5,z5);
glVertex3d(x2,y2,z2);

// KOORDINATENSYSTEM AM SCHLUSS ZEICHNEN
glDisable(GL_LIGHTING);// KOORDINATENSYSTEM immer ohne Lichteffekte
glBegin(GL_LINES); // LINMEIN
// x-Achse
glColor4f(1.0F,0.0,0.0,1.0F);
glVertex3d(0.0,0.0,0.0);
glVertex3d(1.0,0.0,0.0); // zu x=1
// Y achse
glColor4f(0.0F,1.0F,0.0F,1.0F); //GRÜN
glVertex3d(0.0,0.0,0.0);
glVertex3d(0.0,1.0,0.0); // tz =1
// Z Achse
glColor4f(0.0F,0.0F,1.0F,1.0F); // BLAU
glVertex3d(0.0,0.0,0.0);
glVertex3d(0.0,0.0,1.0); //nach z=1
glEnd();
//OGL .Szene berechne zur Darstellung bringen
glFlush();
glFinish();

SwapBuffers(wglGetCurrentDC());
return TRUE;
}

Das Programm lässt sich fehlerfrei kompilieren , aber es wird nix dargestellt.Zu Test zwecken habe ich dann wglMakeCurrent auf true oder false getestet und rausgefunden das der Befehl false ist.Woran liegt das?

ScottManDeath
2003-06-18, 17:41:48
Hi



if(hglrc=NULL)....
besser:

if(hglrc == NULL)...

Bye
ScottManDeath

Lord Nikon
2003-06-18, 17:52:46
@ScottmanDeath
thx , genau daran hat es gelegen.