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?
