ich will in meiner Anwendung ein AVI abspielen. Habe auf Nehe dazu auch ein Beispiel gefunden und diesen dann in meine Anwendung portiert.. Leider nicht ganz so erfolgreich. Das AVI File wird zwar abgespielt. Aber es Flackert total, das Quad auf das ich das Frame zeichne wird immer kurz weiß und zeigt dann wieder das Frame an, und flackert so zwischen Weiß und Frame hin und her.
Also das eigentliche Problem scheint wohl daran zu liegen, dass DrawDibDraw(hdd,DC,0,0,1024,1024,lpbi,pdata,0,0,width,height,0) direkt auf den DeviceContext der Anwendung zugreift. Die komplette "Draw"/Zeichnen/Render Prozedur ist somit komplett überflüssig --> Das ist der Fehler.
Die Graphik, also das Bild aus der AVI-Datei soll auf die Textur gezeichnet werden, nicht (direkt) auf den Bildschirm. Dadurch kommt sonst das Flackern zustande. Die Frage ist, warum klappt das in der Beispielanwendung?
Wie macht man das, dass DrawDibDraw direkt auf die Textur geht?
Auch wenn man mit CreateDC einen neuen DC für das Video erstellt, wird dieses dann später garnicht mehr dargestellt... (Logischerweise).
Da ich leider mit den reinen Texturen noch nicht so bewandert bin, (ich benutze immer glBitmap2d oder so, also eine Komponente, keine reine Integer-ID) hoffe ich mal von Euch kann wer eine Erklärung abgeben. Thx.
Edit: Was hat es denn mit der Funktion CreateCompatibleDC(0) auf sich? Ist das vllt. der Grund? Kann ich bei mir nicht benutzen um den DC zu erstellen, da dann ein Systemfehler kommt beim Renderkontext aktivieren..
Ich werde da die nächsten Tage mal ne ordentliche Klasse draus entwickeln und das Ergebnis hier zum download anbieten. Heut kann ich da nicht mehr mit experimentieren, is schon zu spät :/
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
CreateCompatibleDC erzeugt einen neuen DC der kompatibel zu dem ist den du übergibst. Wenn du 0 übergibst dann wird ein MemoryDC erstellt der kompatibel mit dem Bildschirm der Anwendung ist.
Aber zu dem Code habe ich mal ein paar Fragen bzw Anmerkungen.
Wo erstellst du eigentlich deine Textur? Ich sehe zwar, dass du die wunderbar vorbereitet aber nirgendswo sehe ich ein glGenTextures bzw ein anschließendes Binden der Textur.
Das FlipIt ist absolute unnütz. Seit OpenGL 1.2 wird als Texturformat auch GL_BGR (anstelle von GL_RGB) unterstützt. Das kostet dich keine Leistung und Bedarf keiner Umrechenaktionen. Allerdings ist BGR / RGB als Format manchmal ein bisschen langsamer. Das Idealste Format ist BGRA / RGBA. Selbst wenn der Alphakanal nicht genutzt wird ist es das idealste Format. Ich habe zwar keine Ahnung wie man das hinbekommt ohne es manuell umzurechnen. Aber wenn du das bekommen würdest solltest du es bevorzugen. Wenn nicht lohnt es auch nicht es per Hand zu erzeugen. Das ist dann wiederrum langsamer als das Hochladen bei einigen Grafikkarten.
scheint für das Problem verantwortlich zu sein. Einfach auskommentieren und dann geht es bei mir... Steht der vielleicht auch irgendwo in deinem Quelltext drinnen?
Edit: Na toll, ohne Swapbuffers wird ausser dem Video garnichts mehr gezeichnet. Scheinbar wurde wegen dem Flackern direkt auf den Vordergrundpuffer gezeichnet, der direkt dannach mit dem Hintergrundpuffer überschrieben wurde. Das erklärt auch, wieso du mit deinem Programm keine anderen Sachen mehr siehst...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du benutzt doch den DC deines Fensters! Ich denke mal das war der Grund warum dafür ursprünglich ein MemoryDC erstellt wurde. Eben damit Windows nicht direkt auf das Fenster zeichnet sondern in einen Speicher. Ich denke mal das da genau das passiert. Denn ohne SwapBuffers hast du auch keine OpenGL Ausgabe. Die läuft normal ja erst einmal über den dann ignorierten BackBuffer.
Aber noch mal was ich in meinem vorherigen Post schon gesagt habe. Wo erstellst du überhaupt deine Textur? Ohne Textur gibt es logischerweise normal auch kein Bild!
Es wird jetzt egal sein, wie ich es hier forumliere, Lossy eX wird mir hier gleich ordentlich die Ohren langziehen...
Die Antwort ist: keine Ahnung.
Ich habe bisher quasi Null Plan von OpenGL und muss das beste aus den paar Codeschnipseln machen, die ich habe...
Bitte nicht dass mich hier irgendeiner falsch versteht: die Tutorials hier sind generell super, das Forum nett und hilfsbereit, aaaaber leider bin ich noch nicht mit dem Einarbeiten soweit durch das alles Verstanden zu haben; brauche aber trotzdem schon die Funktionen in meinem Programm :/
Ein weiteres Problem ist, dass es mehrere (wie sagt man?) Libarys,Header,Frameworks, ka. was gibt für mit OpenGL zu arbeiten, z.B. sind meine Texturen alle Komponenten die mit .bind und dann glquads aufgerufen werden, in sofern kam ich noch nie großartig mit sonstigen Texturen in berührung (da diese z.B. auch keine .bmp Dateien etc. laden können, sondern nur mit diesen Zusatzbibliotheken).
Lasst das alles mal hier einfach so (unkommentiert :/ ) stehen, und gehen wir stillschweigend davon aus, dass ich eigentlich keine Ahnung habe, was ich eigentlich hier Programmiere...
Ausgehend von dem wenigen, was ich glaube verstanden zu haben, um Deine Frage mit dem Rendern zu beantworten:
Code:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Hintergrund löschen
Alles AFAIK: * glClear löscht das komplette Bild mit der aktuellen (Hintergrund?)Farbe * glLoadIdentity ersetzt die aktuelle Matrix durch die Identitätsmatrix. <-- keine Ahnung was das jetzt für mich bedeutet, steht halt da immer mit dabei * glquads gibt den Bereich an, der mit der aktuellen Textur gefüllt werden soll. Alle 4 Koordinaten der Ecken. Warum 3d Vertext, ich würde gerne nur 3d benutzen...
Dementsprechend müsste die Funktion GrabAVIFrame den aktuellen Frame als Textur "bind"en, so dass dieser in dem angegebenen Rahmen gezeichnet wird.
Code:
DrawDibDraw(fhdd,fhdc,0,0,256,256,lpbi,pdata,0,0,width,height,0); // Konvertování obrázku na požadovaný formát
Laut http://www.joachimrohde.com/cms/xoops/m ... .php?id=45 bedeuten die Zeilen:
// konvertiere Daten in das geforderte Bitmap Format
DrawDibDraw (hdd, hdc, 0, 0, 256, 256, lpbi, pdata, 0, 0, width, height, 0);
und
// aktualisiere die Textur glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
Also scheint es wirklich so zu sein.
Die Textur selbst wird bei TMyF.CreateNew erzeugt, AFAIK
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Nun ist die Frage: wie zeichne ich mit dem Video auf den selben DC wie die restlichen Texte, so dass bei SwapBuffers die korrekte Anzeige zu sehen ist?
Vielen Dank schonmal, und habt Nachsicht mit mir
Edit: Aktuelle Quelltextversion siehe weiter unten bzw. nächste Seite(n).
Zuletzt geändert von berens am Mo Dez 11, 2006 17:13, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Der Quellcode von NeHe ist sehr alt. Vor geraumer Zeit gab es schon einmal zwei User die damit etwas gemacht hatten. Der eine allerdings mit DirectShow. Aber ich glaube das würde alles zu weit führen.
Ich denke ich muss nicht erwähnen, dass es nie gut ist wenn man etwas einfach so macht ohne zu wissen was man dort tut, oder? Dann ist es ehrlich besser wenn es ein bisschen hinten anstellt anstelle es einfach nur zu kopieren. Aber so etwas muss jeder selber wissen.
Zitat:
Die Textur selbst wird bei TMyF.CreateNew erzeugt, AFAIK glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Nein wird sie nicht. Zu mindest nicht direkt. Der Speicher für die Textur wird erstellt und initialisiert aber erstellt wird die Textur bei einem Aufruf von glGenTextures. Also dabei wird dann eine Texturobjekt in OpenGL erstellt. Und dieses musst du mit glBindTextur binden bevor du etwas mit der Textur machen möchtest. Also Daten updaten, benutzen etc.
Zitat:
Nun ist die Frage: wie zeichne ich mit dem Video auf den selben DC wie die restlichen Texte, so dass bei SwapBuffers die korrekte Anzeige zu sehen ist?
Das Video muss erst einmal auf einen DC gezeichnet werden. Das sollte natürlich NICHT dein Fenster sein wo du OpenGL darstellst. Also MUSS fhdc mit CreateCompatibleDC(0) erstellt worden sein. Damit erstellt er einen DC der sich im Speicher befindet.
Beim Uplaoden der Daten (glTexImage2D und glTexSubImage2D) musst du auch GL_BGR angeben. Ich befürchte nur, dass die unit OpenGL diese gar nicht kennt. Weil sie ebenso alt ist wie der Code von NeHe.
Der Code ist gekürzt und enthält nur das damit es funktionieren sollte. Den Rest musst du bitte schon selber machen. Wenn ich den Code bereinigen würde könnte ich ihn auch gleich komplett neu schreiben und das möchte ich gerne vermeiden.
Zu guter letzt musst du den Backbuffer auch wieder nach vorne bringen sonst siehst du deine Textur natürlich nicht.
PS: Zu der Qualität des Ursprungscodes schweige ich mich am Besten auch mal aus. Ich könnte Dinge sagen die ich später bereuhen würde. Das würde eigentlich auch nicht unbedingt dir gelten würde.
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.