Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 22:35

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kein Dreieck, grün schwarz blinkend
BeitragVerfasst: Mi Feb 06, 2013 14:13 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Guten Tag,
ich bin mittlerweile echt verzweifelt und komme mir irgendwie total dämlich vor.
Ich versuche ein Dreieck zu zeichnen. Aber openGL verhält sich sehr eigenartig.
Der Code ist in C++ geschrieben, aber ich hoffe hier verständlich, bitte schlagt mich nicht dafür. :P

Die initialisierung des render contexts erspare ich euch, da ich ja scheinbar eine Ausgabe bekommen.
Ich habe es mit PDF_DOUBLEBUFFER initialisiert, 32 bit Farbe, 16 bit tiefenpuffer.

Code:
  1.     glViewport(0, 0, 800, 600);
  2.  
  3.     glMatrixMode(GL_PROJECTION);
  4.     glLoadIdentity;
  5.     gluPerspective(60, 800/600, 0.1, 100);
  6.     glMatrixMode(GL_MODELVIEW);
  7.     glLoadIdentity;
  8.     glTranslatef(0, 0, -6);
  9.  
  10.     glClearColor(0, 1.0, 0, 0);
  11.  
  12.     while (handleMessages()) {  // sowas wie Application.handleMessages(); ... gibt false zurück, falls WM_QUIT gefunden wurde ...
  13.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  14.  
  15.         glColor3b(255, 255, 255);
  16.         glBegin(GL_TRIANGLES);
  17.         glVertex3f(-1,-1, 0);
  18.         glVertex3f( 1,-1, 0);
  19.         glVertex3f( 0, 1, 0);
  20.         glEnd;
  21.  
  22.         //glFinish();
  23.         SwapBuffers(dc); // dc is der HDC mittels GetDC(window)
  24.     }


Was erhalte ich? Also wenn ich ab glBegin bis glEnd alles auskommentiere, dann bekomme ich einen schönen RBG-Grünen bildschirm, aber wenn ich es rein nehme, flackert es jeden frame zwischen grün und schwarz. Ich bin echt rahtlos. Ich hab mich extra ganz streng an das tutorial gehalten.

Liebe Grüße :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 06, 2013 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nicht das eigentliche Problem, aber ein weiteres:
Code:
  1. gluPerspective(60, 800/600, 0.1, 100);

In Delphi gibt 800/600 einen float, in C++ kommt ein int raus. Also 800.0f/600.0f benutzen damit dein Seitenverhältnis stimmt.

Was das eigentliche Problem betrifft, auf den ersten Blick sieht OpenGL mäßig alles ok aus (was nicht zwangsläufig heißt das es da ist :mrgreen: ). Bist du sicher das deine handleMessages-Schleife mit dem SwapBuffers so korrekt ist?

P.S: Willkommen bei DGL. Mach dir keine Sorgen, hier sind viele C++ und Java Leute unterwegs., es muss kein Delphi sein :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 06, 2013 14:36 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Danke für die Antwort. Hab das mit dem Viewport mal geändert, allerdings keine besserung.

Der vollständigkeit halber:
Code:
  1. bool handleMessages() {
  2.     MSG record;
  3.  
  4.     while (PeekMessage(&record, 0, 0, 0, PM_REMOVE)) {
  5.         if (record.message == WM_QUIT) {
  6.             return false;
  7.         }
  8.  
  9.         TranslateMessage(&record);
  10.         DispatchMessage(&record);
  11.     }
  12.  
  13.     return true;
  14. }

Code:
  1.     HDC dc = GetDC(window);
  2.  
  3.     PIXELFORMATDESCRIPTOR format;
  4.     ZeroMemory(&format, sizeof(format));
  5.     format.nSize    = sizeof(format);
  6.     format.nVersion = 1;
  7.     format.cColorBits   = 32;
  8.     format.cDepthBits   = 16;
  9.     format.iPixelType   = PFD_TYPE_RGBA;
  10.     format.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER;
  11.  
  12.     int index = ChoosePixelFormat(dc, &format);
  13.     SetPixelFormat(dc, index, &format);
  14.  
  15.     HGLRC gl = wglCreateContext(dc);
  16.     wglMakeCurrent(dc, gl);

Und SwapBuffers ist einfach der normale GDI wgl-Befehl.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 06, 2013 21:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
probiers mal mit dem normalen SwapBuffers ohne wgl ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 06, 2013 22:08 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Ich verwende das SwapBuffers aus der wingdi.h ( über windows.h ).
Nun wenn ich, wie gesagt, den Teil mit den Vertex auskommentiere, erhalte ich einen schönen grünen Bildschirm, der nicht flackert. Sobald ich es dazu nehme, gehts wieder los. :?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 12:26 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Code:
  1. glEnd;

Das ist in C/++ keine Funktionsaufruf, wie in Delphi. Wer glEnd auch nicht aufruft, muss sich nicht wundern, dass nur Müll gemacht wird ...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Oh, der war echt fies. Aber ich wundere mich warum bei dir der Compiler nicht meckert?!

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 12:46 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Er hat sich gemeldet. xD
Zitat:
Notice: This is a statement, not a call

Allerdings ging das ganze in den Ausgaben des Buildscripts und sonstigen Ausgaben der IDE einfach völlig unter.
Hab es erst gemerkt als ich alle Compilermeldungen rot formatieren ließ. :o


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 14:03 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
manchmal is man auch blind...
habs auch nicht gesehen :D

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 21:11 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1944
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Man kann in C++ bei vermeintlichen Methodenaufrufen die Klammern weglassen und der Code kompiliert? O.o
Sagt mir, dass das nicht wahr ist.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 22:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Jupp. Gibt bei gcc in den Standardeinstellungen nichtmal ne Warning :-O. Damit hätte ich auch nicht gerechnet. Aber gut, wer kompiliert schon ohne -Wall -Werror, wo dann sowas passiert:
Code:
  1. ]$ g++ -Wall -Werror -o test test.cc
  2. test.cc: In function ‘int main()’:
  3. test.cc:6:5: error: statement is a reference, not call, to function ‘foo’ [-Werror=address]
  4. test.cc:6:5: error: statement has no effect [-Werror=unused-value]
  5. cc1plus: all warnings being treated as errors


grüße,

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 07, 2013 23:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Stimmt...das ist ne Warning, weil es ja ein legales Statement ist. Compilerwarnings sollte man immer ernst nehmen und wie Fehler behandeln.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 08, 2013 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Frase hat geschrieben:
Man kann in C++ bei vermeintlichen Methodenaufrufen die Klammern weglassen und der Code kompiliert? O.o


Du wunderst dich doch auch nicht, warum a+b; nicht das selbe wie c=a+b; ist.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 18 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.118s | 20 Queries | GZIP : On ]