Grafik-,Render-Engine,OpenGL.



  • Von Shadern wusste ich schon,aber ich dachte es gibt einen direc´kten Weg zur Grafikkarte,ohne OpenGL.
    Denn ich hab mir mal ein Shader-Programm geschrieben,aber es funktioniert bis heute nicht,weswegen ich daran erstmal nicht gearbeitet habe.
    Denn es war immer folgendes:
    Ab da wo ein Shader-Container erstellt werden soll,bricht das Programm ab und es kommt die Windows-Fehlermeldung.



  • coder++ schrieb:

    Von Shadern wusste ich schon,aber ich dachte es gibt einen direc´kten Weg zur Grafikkarte,ohne OpenGL.

    OpenGL bzw. Direct3D sind der direkte Weg zur Grafikkarte (direkter wird's für alle praktischen Zwecke auf einem PC nicht mehr). Rat mal wieso es Direct3D heißt... 😉

    coder++ schrieb:

    Denn ich hab mir mal ein Shader-Programm geschrieben,aber es funktioniert bis heute nicht,weswegen ich daran erstmal nicht gearbeitet habe.
    Denn es war immer folgendes:
    Ab da wo ein Shader-Container erstellt werden soll,bricht das Programm ab und es kommt die Windows-Fehlermeldung.

    Dann war dein Programm wohl fehlerhaft...



  • 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);
    

Anmelden zum Antworten