Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.05.2010, 14:25

OpenGL - Fehler duch Schleife?

Hi an alle,
habe mich nun entschieden auf OpenGL(+SDL) umzusteigen.
Mein erstes Programm hat aber bisher einen Fehler : Wenn ich die Render-Funktion in der (fast)Endlosschleife lasse,
bekomme ich beim Programmende immer eine Fehlermeldung von Windows ("koonnko.exe hat ein Problem festgestellt und muss beendet werden.").
Wenn ich sie allerdings davor stelle (->nur einmal zeichen), funtioniert alles ohne Probleme.
Hier der Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// koonnko.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include "SDL.h"
#include "SDL_opengl.h"

    void Init_OpenGL()  
    {
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
        glClearColor(0.0f,0.0f,0.0f,0.0f);
        glShadeModel(GL_SMOOTH);
    }

    void Render();

    


   int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
         Uint8 * m_pKeystate;
         float fx_plus=0.0f,fy_plus=0.0f;
         m_pKeystate=SDL_GetKeyState(NULL);
         SDL_SetVideoMode(1024,768,16,SDL_OPENGL);
         SDL_WM_SetCaption("Erste OpenGL-Anwendung","...und es geht doch!");
         Init_OpenGL();
         while(1==1)
            {
            Render();
            SDL_PumpEvents();
            if(m_pKeystate[SDLK_SPACE]==true)
            {SDL_Quit();}
         }
     return 0;
    }


  void Render()
    {   
        glClear(GL_COLOR_BUFFER_BIT);
        
        
        glBegin(GL_TRIANGLES);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f(0.0f,0.5f,0.0f);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(-0.5f,-0.5f,0.0f);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f(0.5f,0.5f,0.0f);
        glEnd();

        SDL_GL_SwapBuffers();

    }


Würde mich sehr über Hilfe freuen, danke schonmal ! :)

2

05.05.2010, 14:35

muss des nicht heißen "GLShaderModel" ??
Metal ist keine Musik sondern eine Religion.

3

05.05.2010, 14:42

:sleeping: was sagt der debugger?
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

4

05.05.2010, 14:45

Im OpenGL-spezifischen Teil sticht zumindest auf Anhieb nichts in's Auge, wird eher etwas bei der SDL sein, zu der ich dir leider nicht viel sagen kann, weil mir sowas nicht in's Haus kommt :-).

Was mir etwas suspekt vorkam war das "SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)", da ich das eigentlich in der Intialisierung erwartet haette und nicht eine Zeile ueber glClearColor.

LG
Alyx

5

05.05.2010, 14:45

Schon mal mit das ganze dir mit nem Debuger angeschaut?
Wenn ich jetzt schnell mal über deinen Code drüber schaue stürtzt glaub ich dein Programm ab weil glPushMatrix(); und glPopMatrix(); in der Render funktion fehlt

EDIT: Mist war einer Schneller ^^

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

6

05.05.2010, 14:47

...weil glPushMatrix(); und glPopMatrix(); in der Render funktion fehlt
Ist völlig egal, solange es sich ausgleicht, was in dem Fall auch gegeben ist :-).

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

05.05.2010, 14:47

wann soll die schleife verlassen werden?

C-/C++-Quelltext

1
2
3
4
5
6
7
while(1==1)
            {
            Render();
            SDL_PumpEvents();
            if(m_pKeystate[SDLK_SPACE]==true)
            {SDL_Quit();}
         }


so würde es wenigstens funktionieren... auch wenns schlecht ist xD

C-/C++-Quelltext

1
2
3
4
5
6
7
while(true)
            {
            Render();
            SDL_PumpEvents();
            if(m_pKeystate[SDLK_SPACE])
            {SDL_Quit(); return 0;}
         }
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

8

05.05.2010, 14:50

muss des nicht heißen "GLShaderModel" ??
Passt schon:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
...
    wglMakeCurrent(mhWinDC,mglHandle);

    if( mfFeatures.mbNoVSynch )
        wglSwapIntervalEXT(0);
#endif

    // caps detection

    // maximum line width
    GLint mlw[2];
    glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE,mlw);
    miCapsMaxLineWidth = mlw[1];

    // anisotropy
    int aniso;
    {
        GL_API_CALL("glGetIntegerv");
        glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,(GLint*)&aniso);
    }
    
    // texture size
    {
        GL_API_CALL("glGetIntegerv");
        glGetIntegerv(GL_MAX_TEXTURE_SIZE,(GLint*)&mfFeatures.miMaxTextureSize);
    }

    if( mfFeatures.miAnisotropy>aniso )
        mfFeatures.miAnisotropy = aniso;

    glDepthFunc(GL_LEQUAL);     // setup depth testing
    glShadeModel(GL_SMOOTH);    // enable smooth shading
...

9

05.05.2010, 15:18

so würde es wenigstens funktionieren... auch wenns schlecht ist xD

C-/C++-Quelltext

1
2
3
4
5
6
7
while(true) 
{ 
Render(); 
SDL_PumpEvents(); 
if(m_pKeystate[SDLK_SPACE]) 
{SDL_Quit(); return 0;} 
}

Wenn das was du dort gecoded hast in der main Schleife ausgeführt wird, wird das Programm einfach beendet, ohne, dass irgendetwas freigegeben wird. Deshalb sollte man dort break; statt return 0; benutzen um aus der Schleife zu springen.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

05.05.2010, 15:30

in diesem fall gibt es keinen unterschied zwischen break und return und es ist beides schlecht. wie gesagt, es ist keine perfekte lösung. das war auch nicht mein ziel.

@IAmRegistered ich empfehle dir mit der sfml zu beginnen(welche etwas leicher als die sdl/opengl ist) oder noch etwas mit der konsole zu arbeiten. da gibt es weniger details um die du dich kümmern musst. du kannst dich erstmal auf die grundlagen konzentrieren und ein gefühl fürs programmieren und debugen entwickeln.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige