Hallo Leute,
wollte mich jetzt auch mal intensiv mit OGL beschäftigen. Delphi Kenntnisse besitze ich, dennoch habe ich ein paar grundsätzliche Fragen. Ich habe mir schon ein paar Tutorials durchgelesen und auch gut was davon verstanden. Allerdings hab ich Probleme mit der Implementation. Ich benutze den dglHeader + das Template. Mir stellt sich jetzt allerdings die Frage, wo der ganze Zeichen Krams reinkommt. Ich wollte mit nem Freund ein kleines Strategiespiel nach dem Schere, Stein, Papier System programmieren. Nehmen wir das auch gleich mal als Beispiel. Wo müsste jetzt z.B. der Teil stehen, bei dem das Spielfeld gezeichnet wird? Im Render Teil? Das würde dann bedeuten, dass alles was man sieht neugezeichnet wird bei jedem Aufruf. Gleich dazu meine weitere Frage. Wie oft wird das OnIdle Ereignis aufgerufen? Könnte es da nicht schnell zu Performanceproblemen kommen, wenn man (vorrausgesetzt das wird oft aufgerufen, was ich glaube) alles auf dem Bildschirm komplett neuzeichnet? Oder wäre es besser einen Timer zu benutzen und alles weniger oft zeichnen zu lassen?
Registriert: Fr Mai 14, 2004 18:56 Beiträge: 804 Wohnort: GER/OBB/TÖL-WOR/Greiling
du weisst doch sicher, dass man eine grafikkarte danach bemisst, wieviele fps sie schafft? nun, diese fps sind frames per second = bilder pro sekunde. und diese bilder werden tatsächlich alle paar millisekunden neu gezeichnet. woraus auch meist ein prozessorlast von 100% resultiert. performanceprobleme gibt es dann, wenn deine graka dazu zu schlecht ist.
das onidle-ereignis - einfach mal in die delphi-hilfe onidle eingeben. dort hättest du rausgekriegt, dass wenn "done" auf false bleibt, immer dann, wenn gerade nichs zu tun ist(das programm "idle" ist), also keine andere prozedur oder funktion ausgeführt wird, onidle aufgerufen wird. also idle-idle-idle-idle = zeichnen-zeichnen-zeichnen-zeichnen.
das ganze heisst nun progrmmiertechnisch:
ja. alles was gerendert werden soll, kommt in die onidle-prozedur. und zwar genau vor den showtext;-aufruf.
das mit dem timer: durch das onidle wird so oft wie möglich gezeichnet. und das ist doch immer besser, als mit einem timer(der übrigens ressourcen verbraucht), oder?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Halt halt, ... Der einwurf mit dem Timer ist berechtigt. Es gab und gibt durchaus viele Templates die auf Timer setzen. Vorteil ist nämlich eine Möglichkeit die Maximale Framezahl und vorallem die Prozessorauslastung einzugrenzen. Laptopuser finden es nämlich gar nicht schick, wenn im Akkubetrieb der Processor die Laufzeit auf ca. 2 min verkürzt (bei mir z.B. )
Danke, das erklärt schonmal einiges.
Wenn ich jetzt z.B.
Code:
glOrtho(0,640,0,480, 0,128);
LoadTexture('steam_logo.tga',MyTex,False);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MyTex);
DrawQuad(0,0,0,128,128);
vor showText mache, müsste ich doch schon ein resultat sehen? Eigentlich hätte ich gedacht das muss gezeichnet werden, während man im Projektionsmodus ist.
Im Endeffekt packe ich also sämtlich Dinge die man nachher gerade im Spiel sehen soll in den Render Teil.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja, aber net im Projektionsmodus. Im Modelviewmodus werden die Objekte definiert, im Projektionsmodus wird die "Kamera" oder besser die Sicht auf die Objekte bestimmt.
Wenn du nix siehst kann das daran liegen, dass du "im" Objekt stehst. Zoom mal ein stück nach hinten raus. Ach und denk an die Reihenfolge wie du die Punkte definierst. Sonst schlägt das Backfaceculling zu .
_________________ Blog: kevin-fleischer.de und fbaingermany.com
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glOrtho(0,640,480,0, 1,10);
LoadTexture('steam_logo.tga',MyTex,False);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MyTex);
DrawQuad(0,0,0,128,128);
glDisable(GL_TEXTURE_2D);
PrintText(100,100,'Das funktioniert');
ShowText;
Kann mir jemand sagen, wo mein Denkfehler liegt? Der Text wird nur angezeigt wenn ich für zNear bei glOrtho einen positiven Wert verwende, allerdings wird das Viereck nicht gezeichnet
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du hast do das Template sagtest du? Dort ssollte ja erstma alles Funktionieren (3D). Wenn du jetzt 2D testen willst solltest du unbedingt das Tutorial von Sascha (2D in OpenGL, bei den Einsteigertuts) lesen. Dort sollte dann auch stehn, dass man keine Perspective setzen muss, wenn man die anschließend eh mit glOrtho wieder plattmacht.
Das OnIdle Ereigniss wird eigentlich net direkt zum zeichnen missbraucht, sondern ruft eine Renderprocedure auf. (Im OnIdle kann man nämlich schön einen Framecounter installieren. Mit dem Renderzeugs wird das aber schnell unübersichtlich.
Hier mal meine Renderprocedur aus nem ziemlich großen Projekt:
Code:
procedure TForm1.Render;
begin
//
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(0.0, 1023, 767, 0.0, -1.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glColor3f(1,1,1);
if (Spiel.GVGameStat > 0)and(Spiel.GVGameStat < 5)
then RenderIntro
else Spiel.Show;
SwapBuffers(DC);
end;
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Ok, geht alles soweit. Allerdings versteh ich noch nicht so ganz wann ein Quadrat von der Rückseite gezeichnet wird und wann nicht? Man gibt doch lediglich 4 Koordinaten an, woher weiß OGL nun obs vorne ist oder nicht. Denn im mom wird alles spiegelverkehrt angezeigt wenn CULL_FACE aus ist, ansonsten halt gar nicht.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Die Textur direkt im OnIdle-Ereignis zu laden ist eine denkbar schlechte Idee, denn dann wird die Textur wieder und wieder neu geladen, was völlig unnötig ist. Am besten du lädst die Textur gleich nachdem du OpenGL initialisiert hast (z.B. im OnCreate-Ereignis deines Formulars).
Welche Seite deines Polygons die Forder- bzw. Rückseite ist (und damit durch Backfaceculling gecullt wird) wird durch die Definition deines Polygons festgelegt. Ein ungeschriebenes Gesetzt besagt, dass man die Polygone nach Möglichkeit alle gegen den Uhrzeigersinn definieren sollte. Damit werden die jeweiligen Seiten festgelegt.
Welche Seite letztendlich wirklich als vorn und hinten gewertet wird lässt sich mit Hilfe der Funktion glFrontFace festlegen. Erlaubte Parameter sind GL_CW und GL_CCW (clockwise / counter clockwise).
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Genau. Als kleine Denk-Hilfe empfehle ich, dass Du Dir beim Quadrat immer die untere linke Ecke schnappst und als ersten Punkt definierst, dann die rechte untere, die obere rechte und schlußendlich die obere linke. Wenn man sich dieses Reihenolge einmal eingeprägt hat, wird es mit dem Culling kein Problem mehr geben und ... auch die Texturierung ällt so im Geiste sehr leicht aus. Ein paar mal gemacht und es geht dann sowieso von alleine
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also ich fang immer links oben an.
PS: Bei Fragen zu sachen wie z.B. "Was ist Backface Culling?" oder "Was macht die Funktion glFrontface?" hilft unser Wiki weiter. Da steht sowas drinnen. Also ruhig mal reinstöbern.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
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.