Grafik-,Render-Engine,OpenGL.



  • Er sollte ja nur einen bloßen Container für die Shader erstellen und dann stürzt das Programm immer ab.
    Keine Ahnung warum.



  • Du hast in Zeile 7 vergessen Speicher anzufordern, weswegen das Programm in Speicher schreibt, den es nicht besitzt.

    Ne, im Ernst:
    Was bringt uns diese Aussage ohne Source Code?



  • 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 nicht

    glewinit()
    

    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.


Anmelden zum Antworten