Grafik-,Render-Engine,OpenGL.
-
Ja,da hast du wohl recht.
Ok hier:
const char *VS_Quelle,*FS_Quelle; VS_Quelle = VS_Shadercode.c_str(); //VS_Shadercode und FS_Shadercode sind Strings mit den Shadercodes FS_Quelle = FS_Shadercode.c_str(); const char *vv = VS_Quelle; const char *ff = FS_Quelle; GLuint VertexShader = glCreateShader(GL_VERTEX_SHADER); //Hier bricht das Programm ab GLuint FragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(VertexShader,1,&vv,NULL); glShaderSource(FragmentShader,1,&ff,NULL); glCompileShader(VertexShader); glCompileShader(FragmentShader); ShaderProgramm = glCreateProgram(); glAttachShader(ShaderProgramm,VertexShader); glAttachShader(ShaderProgramm,FragmentShader); glDeleteShader(VertexShader); glDeleteShader(FragmentShader); glLinkProgram(ShaderProgramm); glUseProgram(ShaderProgramm);
-
Ich seh in dem Code keine Form von Fehlerbehandlung. Wie genau "bricht das Programm ab"? Hast du an der Stelle überhaupt einen gültigen OpenGL Context?
-
Es kommt diese Fehlermedlung,wo man den Problembericht senden kann oder nicht und oben steht:Das Programm reagiert nicht.
Und was meinst du mit OpenGL-Kontext?
-
Lass das Programm mal in einem Debugger laufen...
-
Hmmm...
Ich glaube ich habe noch nichtglewinit()
aufgerufen.
Könnte der Fehler sein,oder?
-
Ja, das wird sogar ganz bestimmt der Fehler sein. In jedem Fall solltest du lernen, wie man einen Debugger benutzt; das ist für einen Programmierer in etwa so essentiell, wie für einen Tennisspieler die Fähigkeit zu laufen...
-
Ok,thx.
-
Sorry,dass ich das Thema nochmal aufgreife,aber es funktioniert immer noch nicht(der Debugger,sagt auch nicht mehr dazu):
Wenn ich das Programm starte,kommt eine Fehlermeldung,dass der Prozedureinstiegspunkt "Glewinit()" nicht gefunden werden konnte.
-
Wie erstellst du das Fenster und den OpenGL Context?
-
Das Fenster erstelle ich komplett mit der WinAPI und den OpenGL-Kontext direkt mit OpenGL.
-
Schade nur, dass OpenGL keinen Context erstellen kann.
-
cooky451 schrieb:
Schade nur, dass OpenGL keinen Context erstellen kann.
Wie meinst du das?
-
Du musst den OpenGL Kontext auch mit einer WinAPI-OpenGL Erweiterung erstellen, wglCreateContext(), sagt dir das was?
Zeig mal den Code fürs Fenster, da wird der Fehler liegen.
-
Ok.
//Bildschirmsauflösung BBreite = 1280; BHoehe = 1024; AufloesungX = BBreite; AufloesungY = BHoehe; WNDCLASS wclass; HWND hwnd; HDC hDC; HGLRC hRC; MSG message; //Fenster-Klasse wclass.style = NULL; wclass.lpfnWndProc = WndProc; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; wclass.hInstance = hInstance; wclass.hIcon = LoadIcon(hInstance,(LPCSTR)EndofEarthicon); wclass.hCursor = LoadCursor(NULL,IDC_ARROW); wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wclass.lpszMenuName = NULL; wclass.lpszClassName = "Fenster"; RegisterClass(&wclass); //Maus unsichtbar machen ShowCursor(false); //Fenster erstellen hwnd = CreateWindow("Fenster","End of Earth", WS_POPUPWINDOW, 0,0, BBreite,BHoehe, NULL,NULL, hInstance,NULL);
-
-
Achso,das meinst du.
Hab ich auch:PIXELFORMATDESCRIPTOR pfd; int iFormat; *hDC = GetDC (hWnd); ZeroMemory (&pfd,sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); *hRC = wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC);
-
Ah, du hantierst mit Pointern rum.
Sieht gut aus - also eher schlecht.
Zeig bitte mal ein vollständiges Minimalbeispiel oder den ganzen Code, wenns nicht zuviel ist.
Es könnte aber daran liegen, dass wglCreateContext() failed, prüfe mal den Rückgabetyp.
-
Ok,hier main.cpp:
//////////////// //End of Earth// //////////////// //Projekt #include <main.h> //Win-Main LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int iCmdShow) { //Bildschirmsauflösung BBreite = 1280; BHoehe = 1024; AufloesungX = BBreite; AufloesungY = BHoehe; WNDCLASS wclass; HWND hwnd; HDC hDC; HGLRC hRC; MSG message; //Fenster-Klasse wclass.style = NULL; wclass.lpfnWndProc = WndProc; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; wclass.hInstance = hInstance; wclass.hIcon = LoadIcon(hInstance,(LPCSTR)EndofEarthicon); wclass.hCursor = LoadCursor(NULL,IDC_ARROW); wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wclass.lpszMenuName = NULL; wclass.lpszClassName = "Fenster"; RegisterClass(&wclass); //Maus unsichtbar machen ShowCursor(false); //Fenster erstellen hwnd = CreateWindow("Fenster","End of Earth", WS_POPUPWINDOW, 0,0, BBreite,BHoehe, NULL,NULL, hInstance,NULL); //SuperReal-Engine starten srStarten(hwnd,&hDC,&hRC); //Laden int Zeit = 0; int Zeitalt = 0; int Ladezeit = 0; int Ladezeitalt = 0; Ladezeitalt = GetTickCount(); Zeitalt = GetTickCount(); srErstelleObjekt Spieler; Zeit = GetTickCount(); cout<<"\nObjekt erstellen \x22Spieler\x22 ("<<sizeof(Spieler)<<" Bytes): "<<Zeit - Zeitalt<<" ms\n"; Zeitalt = GetTickCount(); Spieler.LadeX("Data/Modell/Mensch.x","Data/Textur/"); Zeit = GetTickCount(); cout<<"\nDirectX 3D-Datei laden \x22Spieler\x22 (237.568 Bytes): "<<Zeit - Zeitalt<<" ms\n"; Ladezeit = GetTickCount(); cout<<"\nGeladen in "<<Ladezeit - Ladezeitalt<<" ms\n\n\n"; //Shader /* cout<<"\nLade Shader...\n"; srSchreibeShader("Data/Temp/Shader","void main()\n{\n gl_Position = ftransform ();\n}","void main()\n{\n}"); GLuint Testshader; srInstalliereShader(Testshader,"Data/Temp/Shader","Data/Temp/Shader"); srLoescheShader("Data/Temp/Shader"); cout<<"\nShader geladen\n"; */ //Zeige Fenster ShowWindow(hwnd,iCmdShow); //Hauptschleife while (!Verlassen) { //Nachrichten überprüfen if (PeekMessage(&message,NULL,0,0,PM_REMOVE)) { if (message.message == WM_QUIT) { Verlassen = true; } else { TranslateMessage(&message); DispatchMessage(&message); } } else { //Anfang der Hauptschleife srSchleifenAnfang(); //Kamera glMatrixMode(GL_PROJECTION); glLoadIdentity(); glLoadMatrixf(ProjMatrix1); glViewport(0,0,AufloesungX,AufloesungY); gluPerspective(60.0f,(GLfloat)BBreite / (GLfloat)BHoehe,0.1f,1000.0f); glRotated(Kameravertikal,1.0,0.0,0.0); //Kamera vertikal drehen glRotated(-Kamerahorizontal + 90,0.0,1.0,0.0); //Kamera horizontal drehen Laufen(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLoadMatrixf(ModelMatrix1); //Rendern srRender(0.0,0.5,0.75,1.0); //An/-Ausschalten glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); ///////// //Szene// ///////// //Licht glEnable(GL_LIGHT0); GLfloat Lichtposition1[4] = {0.0,3.0,1.0,1.0}; GLfloat Lichtkegel1 = 180.0; GLfloat LichtAmbient1[4] = {0.3f,0.3f,0.3f,1.0f}; glLightfv(GL_LIGHT0,GL_AMBIENT,&LichtAmbient1[0]); //Objekte glScalef(0.01,0.01,0.01); Zeitalt = GetTickCount(); Spieler.Render(); Zeit = GetTickCount(); ////////////////// //Ende der Szene// ////////////////// //Matrizen holen glGetFloatv(GL_PROJECTION_MATRIX,&ProjMatrix[0]); glGetFloatv(GL_MODELVIEW_MATRIX,&ModelMatrix[0]); //Buffer srBuffer(hDC); //Bearbeitung srSofort(); //Ausgabe cout<<"\rRendern von Objekten("<<sizeof(Spieler)<<" Bytes): "<<Zeit - Zeitalt<<" ms "; cout<<"FPS"<<FPS; //Ende der Hauptschleife srSchleifenEnde(); } } srBeenden(hwnd,hDC,hRC); return 0; }
Falls du die Dateien meiner Engine benötigst,dann schreib es bitte.
-
Die srStarten() Funktion bitte.
-
//////////////////// //SuperReal-Engine// //////////////////// //WinAPI #include <windows.h> #include <commctrl.h> //C++ #include <stdio.h> #include <iostream> #include <fstream> #include <string.h> #include <math.h> #include <vector> #include <cassert> using namespace std; //OpenGL mit Erweiterungen #include <GL/glew.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <GL/glui.h> #include <GL/GLAux.h> #include <GL/glext.h> //Simple OpenGL Image Library #include <SOIL.h> //Deklerationen bool srOpenGLaktiv = false; int Startzeit; //Startzeit der Hauptschleife int Endzeit; //Endzeit der Hauptschleife int Zwischenzeit; //Zeit zwischen Endzeit und Startzeit float FPS; //Bilder pro Sekunde(FPS) //Engine #include <Container/Container.h> #include <Datei/Datei.h> #include <Shader/Shader.h> #include <Render/Render.h> #include <Textur/Textur.h> #include <Objekt/Objekt.h> #include <Mesh/Mesh.h> //SuperReal starten void srStarten(HWND hWnd,HDC *hDC,HGLRC *hRC) { //OpenGL initialisieren PIXELFORMATDESCRIPTOR pfd; int iFormat; *hDC = GetDC (hWnd); ZeroMemory (&pfd,sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat(*hDC,&pfd); SetPixelFormat(*hDC,iFormat,&pfd); *hRC = wglCreateContext(*hDC); wglMakeCurrent(*hDC,*hRC); srOpenGLaktiv = true; } //SuperReal beenden void srBeenden(HWND hWnd,HDC hDC,HGLRC hRC) { //OpenGL aufräumen wglMakeCurrent(NULL,NULL); wglDeleteContext(hRC); ReleaseDC (hWnd,hDC); srOpenGLaktiv = false; } //Anfang Hauptschleife void srSchleifenAnfang() { //Startzeit Startzeit = GetTickCount(); //Zwischenzeit Zwischenzeit = Startzeit - Endzeit; } //Ende Hauptschleife void srSchleifenEnde() { //Endzeit Endzeit = GetTickCount(); //FPS if (Endzeit > Startzeit) { FPS = (float)(1000.0 / (Endzeit - Startzeit)); } }