Dev-C++| Quadrat wird mit Streifen dargestelllt !?



  • Hi Leute,
    erstmal 'Danke' im voraus für eure Antworten.
    Ich hätte da mal wieder ein Problem mit einem eigentlichen recht einfachen Projekt. Es sollte bei diesem programm eigentlich nur ganz normal ein 3D-Würfel dargestellt werden. Doch er wird mit Streifen angezeigt !?
    Ich versteh das nicht so ganz und wollt mal einen von euch fragen ob er weiss woran es liegen kann. Ich mein die Streifen sind ja Recht stylisch, aber sie sind eigentlich nicht geplant. Währe wie schone rwähnt sehr dankbar für eine Antwort.
    Denke es ist nru ein kleiner Render-to-texture fehler. Find ich natürlich nicht.
    Also hier der Code ab der BOOL CreateGLWindow-Struktur.

    BOOL CreateGLWindow(char *Fenstertitel,int width,int height,int bits,bool fullscreenflag)
    {
    GLuint PixelFormat;
    WNDCLASS wc;
    DWORD dwExStyle;
    DWORD dwStyle;
    RECT WindowRect;
    WindowRect.left=(long)0;
    WindowRect.right=(long)width;
    WindowRect.top=(long)0;
    WindowRect.bottom=(long)height;
    
    fullscreenflag=fullscreen;
    
    hInstance =GetModuleHandle(NULL);
    wc.hInstance = hInstance;
    wc.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpszMenuName=NULL;
    wc.lpszClassName="OpenGL";
    wc.lpfnWndProc=(WNDPROC) WndProc;
    wc.hbrBackground=NULL;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.cbWndExtra=0;
    wc.cbClsExtra=0;
    
    if(!RegisterClass(&wc))
    {
                           MessageBox(NULL,"Konnte die Fensterklassen nicht registrieren","Fehler",MB_OK);
                           return FALSE;
                           }
    
    if(fullscreen)
    {
    DEVMODE dmScreenSettings;
    dmScreenSettings.dmPelsWidth=width;
    dmScreenSettings.dmPelsHeight=height;
    dmScreenSettings.dmBitsPerPel=bits;
    dmScreenSettings.dmFields=DM_PELSWIDTH | DM_BITSPERPEL | DM_PELSHEIGHT;
    }
    
    if(fullscreen)
    {
    dwExStyle=WS_EX_APPWINDOW;
    dwStyle=WS_POPUP;
    ShowCursor(FALSE);
    }
    else
    {
    dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
    dwStyle=WS_OVERLAPPEDWINDOW;
    }
    
    AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);
    
    if(!(hWnd=CreateWindowEx(
    dwExStyle,
    "OpenGL",
    Fenstertitel,
    WS_CLIPSIBLINGS | 
    WS_CLIPCHILDREN |
    dwStyle,
    100,100,
    1000,
    700,
    NULL,
    NULL,
    hInstance,
    NULL)))
    
    static PIXELFORMATDESCRIPTOR pfd=
    {
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW |
    PFD_SUPPORT_OPENGL |
    PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    bits,
    0,0,0,0,0,0,
    0,
    0,
    0,
    0,0,0,0,
    16,
    0,
    0,
    PFD_MAIN_PLANE,
    0,
    0,0,0
    };
    
    static PIXELFORMATDESCRIPTOR pfd;
    if(!(hDC=GetDC(hWnd)))
    {
    KillGLWindow();
    return FALSE;
    }
    
    if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) 
    {
    KillGLWindow();
    return FALSE;
    }
    
    if(!(SetPixelFormat(hDC,PixelFormat,&pfd)))
    {
    KillGLWindow();
    return FALSE;
    }
    
    if(!(hRC=wglCreateContext(hDC)))
    {
    KillGLWindow();
    return FALSE;
    }
    
    if(!wglMakeCurrent(hDC,hRC))
    {
    KillGLWindow();
    return FALSE;
    }
    
    ShowWindow(hWnd,SW_SHOW);
    SetForegroundWindow(hWnd);
    SetFocus(hWnd);
    ReSizeGLScene(width,height);
    
    if(!InitGL())
    {
    KillGLWindow();
    return FALSE;
    }
    
    return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    switch(message)
    {
    case WM_CLOSE:
    {
    PostQuitMessage(0);
    return 0;
    }
    
                                case WM_SIZE:
                                     {
                                             ReSizeGLScene(LOWORD(wParam),HIWORD(wParam));
                                             return 0;
                                             }
    
       case WM_KEYDOWN:
            {
                       keys[wParam]=TRUE;
                       return 0;
                       }
    
    }
    return DefWindowProc(hWnd,message,wParam,lParam);
    }
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
    {
    MSG msg;
    BOOL done=FALSE;
    
    fullscreen=FALSE;
    
    if(!CreateGLWindow("Steve's 3D-Testprogramm",1024,768,32,fullscreen))
    {
    return 0;
    }
    
    while(!done)
    {
    
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    if(msg.message==WM_QUIT)
    {
    done=TRUE;
    }
    else
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    
    else
    {
    if(active)
    {
    if(keys[VK_ESCAPE])
    {
    active=TRUE;
    }
    else
    {
    DrawGLScene();
    SwapBuffers(hDC);
    }
    }
    
    }
    }
    
    KillGLWindow();
    return (msg.wParam);
    }
    


  • 1. Ein Bild sagt mehr als 1000 Worte
    2. Könntest du endlich mal deinen Code mit CPP Tags formatieren und ordentlich ausrichten? (hab ich dir schon ca 3mal gesagt)
    3. Nur relevanten Code posten
    4. "Streifen" können auf ein Problem mit dem Backbuffer deuten. Löschst du den in jedem Frame richtig?



  • Mann pivke, du bist jetzt schon so groß und hast es immer noch nicht gelernt cpp-tags zu verwenden ? 🙄



  • Mann pivke, du bist jetzt schon so groß und hast es immer noch nicht gelernt cpp-tags zu verwenden

    Sry, dachte immer mit Code Tag's meint ihr die normalen, hab grad erst die C# tags entdeckt :-).
    Danke.

    Bringt ja nichts wenn ich das Bild einfüge, weil in dem Augenblick wo ich ein Screenshot mache das Bild normal aussieht. Also die Linien sind dann nicht da und das Objekt sieht normal aus.
    Also hab ich heir mal schwind das Programm geuppt :
    http://www.megaupload.com/de/?d=A3E0DH3I
    (Und bitte nicht meckern, bin noch absoluter Noob und bin grad am Anfang)



  • pivke schrieb:

    Sry, dachte immer mit Code Tag's meint ihr die normalen, hab grad erst die C# tags entdeckt :-).

    Wusste garnicht, dass du in C# programmierst...
    Dein Code ist immernoch grauenhaft formatiert - bei so einer nicht vorhanden Einrückung würde ich auch nicht mehr durchblicken.

    pivke schrieb:

    Bringt ja nichts wenn ich das Bild einfüge, weil in dem Augenblick wo ich ein Screenshot mache das Bild normal aussieht. Also die Linien sind dann nicht da und das Objekt sieht normal aus.

    Hm?? Wenn das Programm läuft ist es falsch, aber wenn du einen Screenshot davon machst (sprich eine 1:1 Momentaufnahme), dann sieht man den Fehler nicht? Versteh ich nicht.

    Nebenbei: Wenn ich deine exe ausführe, kommt bei mir lediglich ein Fenster mit durchsichtiger ClientArea.



  • Zeig doch mal den Render-Teil deines Codes (DrawGLScene).
    Also den, der den Würfel zeichnet.



  • Ich habe es auch mal getestet, und sehe diese Streifen auch.

    Das sieht ziemlich nach den Streifen bei Fernsehgeräten aus, wenn man sie durch eine Digitalkamera etc. betrachtet 😉

    Einen Screenshot habe ich auch versucht zu machen, wobei ich nur den obersten Teil des Würfels erwischt habe.

    Für mich sieht das ganze sehr danach aus, als würde das Widget immer wieder nur einen Teil des Würfels zeigen, und Sekundenbruchteile danach den nächsten.

    Dein Programm flimmert ganz einfach ziemlich arg 😉

    Nun kenne ich mich mit der WinAPI nicht aus, und gebe deswegen hiermit meine Ideen an User weiter, die sich damit auskennen 😉



  • [quote] Zeig doch mal den Render-Teil deines Codes (DrawGLScene).
    Also den, der den Würfel zeichnet.
    [code]
    Ja aber wundert euch nicht, ich hab ih einfach aus dem Nehe-Tutorial kopiert, da mir der teil zu einfach war.

    #include <windows.h>		// Header File For Windows
    #include <gl\gl.h>			// Header File For The OpenGL32 Library
    #include <gl\glu.h>			// Header File For The GLu32 Library
    #include <gl\glaux.h>		// Header File For The Glaux Library
    
    HDC			hDC=NULL;		// Private GDI Device Context
    HGLRC		hRC=NULL;		// Permanent Rendering Context
    HWND		hWnd=NULL;		// Holds Our Window Handle
    HINSTANCE	hInstance;		// Holds The Instance Of The Application
    
    bool	keys[256];			// Array Used For The Keyboard Routine
    bool	active=TRUE;		// Window Active Flag Set To TRUE By Default
    bool	fullscreen=TRUE;	// Fullscreen Flag Set To Fullscreen Mode By Default
    
    GLfloat	rtri;				// Angle For The Triangle ( NEW )
    GLfloat	rquad;			
    
    LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// Declaration For WndProc
    
    GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		// Resize And Initialize The GL Window
    {
    	if (height==0)										// Prevent A Divide By Zero By
    	{
    		height=1;										// Making Height Equal One
    	}
    
    	glViewport(0,0,width,height);						// Reset The Current Viewport
    
    	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
    	glLoadIdentity();									// Reset The Projection Matrix
    
    	// Calculate The Aspect Ratio Of The Window
    	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    
    	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
    	glLoadIdentity();									// Reset The Modelview Matrix
    }
    
    int InitGL(GLvoid)										// All Setup For OpenGL Goes Here
    {
    	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
    	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);				// Black Background
    	glClearDepth(1.0f);									// Depth Buffer Setup
    	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
    	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
    	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
    	return TRUE;										// Initialization Went OK
    }
    
    int DrawGLScene(GLvoid)									// Here's Where We Do All The Drawing
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
    	glLoadIdentity();									// Reset The Current Modelview Matrix
    					// Rotate The Triangle On The Y axis ( NEW )
    									// Done Drawing The Pyramid
    
    	glLoadIdentity();									// Reset The Current Modelview Matrix
    	glTranslatef(0.0f,0.0f,-5.0f);						// Move Right 1.5 Units And Into The Screen 7.0
    	glRotatef(rquad,1.0f,1.0f,1.0f);					// Rotate The Quad On The X axis ( NEW )
    	glBegin(GL_QUADS);									// Draw A Quad
    		glColor3f(0.0f,1.0f,0.0f);						// Set The Color To Blue
    		glVertex3f( 1.0f, 1.0f,-1.0f);					// Top Right Of The Quad (Top)
    		glVertex3f(-1.0f, 1.0f,-1.0f);					// Top Left Of The Quad (Top)
    		glVertex3f(-1.0f, 1.0f, 1.0f);					// Bottom Left Of The Quad (Top)
    		glVertex3f( 1.0f, 1.0f, 1.0f);					// Bottom Right Of The Quad (Top)
    		glColor3f(1.0f,0.5f,0.0f);						// Set The Color To Orange
    		glVertex3f( 1.0f,-1.0f, 1.0f);					// Top Right Of The Quad (Bottom)
    		glVertex3f(-1.0f,-1.0f, 1.0f);					// Top Left Of The Quad (Bottom)
    		glVertex3f(-1.0f,-1.0f,-1.0f);					// Bottom Left Of The Quad (Bottom)
    		glVertex3f( 1.0f,-1.0f,-1.0f);					// Bottom Right Of The Quad (Bottom)
    		glColor3f(1.0f,0.0f,0.0f);						// Set The Color To Red
    		glVertex3f( 1.0f, 1.0f, 1.0f);					// Top Right Of The Quad (Front)
    		glVertex3f(-1.0f, 1.0f, 1.0f);					// Top Left Of The Quad (Front)
    		glVertex3f(-1.0f,-1.0f, 1.0f);					// Bottom Left Of The Quad (Front)
    		glVertex3f( 1.0f,-1.0f, 1.0f);					// Bottom Right Of The Quad (Front)
    		glColor3f(1.0f,1.0f,0.0f);						// Set The Color To Yellow
    		glVertex3f( 1.0f,-1.0f,-1.0f);					// Top Right Of The Quad (Back)
    		glVertex3f(-1.0f,-1.0f,-1.0f);					// Top Left Of The Quad (Back)
    		glVertex3f(-1.0f, 1.0f,-1.0f);					// Bottom Left Of The Quad (Back)
    		glVertex3f( 1.0f, 1.0f,-1.0f);					// Bottom Right Of The Quad (Back)
    		glColor3f(0.0f,0.0f,1.0f);						// Set The Color To Blue
    		glVertex3f(-1.0f, 1.0f, 1.0f);					// Top Right Of The Quad (Left)
    		glVertex3f(-1.0f, 1.0f,-1.0f);					// Top Left Of The Quad (Left)
    		glVertex3f(-1.0f,-1.0f,-1.0f);					// Bottom Left Of The Quad (Left)
    		glVertex3f(-1.0f,-1.0f, 1.0f);					// Bottom Right Of The Quad (Left)
    		glColor3f(1.0f,0.0f,1.0f);						// Set The Color To Violet
    		glVertex3f( 1.0f, 1.0f,-1.0f);					// Top Right Of The Quad (Right)
    		glVertex3f( 1.0f, 1.0f, 1.0f);					// Top Left Of The Quad (Right)
    		glVertex3f( 1.0f,-1.0f, 1.0f);					// Bottom Left Of The Quad (Right)
    		glVertex3f( 1.0f,-1.0f,-1.0f);					// Bottom Right Of The Quad (Right)
    	glEnd();											// Done Drawing The Quad
    
    										// Increase The Rotation Variable For The Triangle ( NEW )
    	rquad-=0.01f;										// Decrease The Rotation Variable For The Quad ( NEW )
    	return TRUE;										// Keep Going
    }
    
    GLvoid KillGLWindow(GLvoid)								// Properly Kill The Window
    {
    }
    


  • du hast kein double-buffering.

    denn du fuellst einen anderen PIXELFORMATDESCRIPTOR nur dann korrekt, wenn CreateWindowEx fehlschlaegt.
    nimm dir mal dringend zu herzen was die leute ueber dein source-layout sagen.



  • Ja aber die CreateWindowEx schlägt doch nicht fehl.
    Und wenn müsste die PixelFormatdescriptor-Struktur doch richtig sein.



  • du solltest aber schon in der lage sein, deinen "eigenen" code zu verstehen.
    schau mal:

    // nur dann wenn hWnd==NULL fuellst du die PIXELFORMATDESCRIPTOR-struktur:
    if(!(hWnd=CreateWindowEx(...)))
      static PIXELFORMATDESCRIPTOR pfd=
      {
        sizeof(PIXELFORMATDESCRIPTOR),
    // ...
      };
    
    // und hier machst du 'ne neue:
    static PIXELFORMATDESCRIPTOR pfd;
    // da steht aber nichts drin (ausser ein bischen speicherschrott)...
    
    if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
    {
    }
    

    alles klar? 😃


Anmelden zum Antworten