ich wollte einen Directshow Renderer schreiben, der die Videodaten via OpenGL darstellt. Im Prinzip sollte das nicht so aufwändig sein, durch die vorgeschriebenen 2^n Texturen ist es allerdings nicht so einfach wie ich vorerst angenommen habe.
GL_TEXTURE_RECTANGLE_ARB sollte eigentlich diese Textur-Restriktion umgehen, jedoch funktioniert es überhaupt nicht so wie ich mir das gedacht hab.
Das komplette Testbeispiel habe ich mal an den Post gehängt, vielleicht findet sich jemand mit Ahnung
Christian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
jedoch funktioniert es überhaupt nicht so wie ich mir das gedacht hab.
Tschuldige meine Glaskugel ist gerade in der Reinigung. Was funktioniert denn nicht? Sieht du überhaupt etwas? Ist das Bild verzerrt oder vielleicht die Farben falsch. Bei schwierig zu Beschreibendem bitte ein Bild.
Ich persönlich habe schon mit Texture_rectangle gearbeitet und da lief alles bestens.
Evtl solltest du an Stelle glTexImage2D lieber glTexSubImage2D verwenden. Das ist wohl schneller. Es würde auch genügen, wenn du die Textur bei jedem Mal neu anlagst. Also Erstellen, Daten hochladen dann freigeben. Also bei jedem Bild.
PS: ist kein Witz. Das ist echt schneller als wie wenn du die alte Textur immer recyclest.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hast du mal mit glError überprüft ob Fehler aufgetreten sind? Dann würde ich Testweise mal GL_CULL_FACE deaktivieren. Vielleicht siehst du ja bloß die ausgeblendete Rückseite.
Und funktioniert es, wenn du 2^n - Texturen verwendest? Deine Problembeschreibung klingt nämlich so, als ob der Screen nur bei GL_TEXTURE_RECTANGLE_ARB schwarz bleibt...
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Naja, ich muss gestehen. Vor einigen Jahren habe ich mich mit OpenGL (in Kombi Delphi+SDL) auseinandergesetzt (www.tu-ilmenau.de/~hackbart). Wie das jedoch so ist mit Dingen die man einige Zeit vernachlässigt, mann verlernt diese (okay nicht alles, aber in meinem Fall OpenGL). Das Bild bleibt übrigens einfach schwarz.
Wenn ich quadratische Texturen auf 2^n Basis nehme ist dem auch so. Erstaunlicherweise sieht man jedoch was, wenn ich nicht über das Callback des Directshow Renderers gehe...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ist das vielleicht ein Callback der über eine extrenen Thread aufgerufen wird? OpenGL ist Threadabhängig. Du müsstest das enttweder komplett über den Thread arbeiten. Also initialisieren und alles oder du nimmst die Daten des Callbacks und legst diese themporär ab und rufst dann ein zeichnen auf. Wichtig ist, dass du das evtl. mit einem Synchronize machst also wenn dies möglich. Evtl müsstest du die Daten dann auch nicht zwischenspeichern. Du musst aber auf jeden Fall dann aus dem VCL Thread rendern.
Ich hab die Routine nochmal umgeschrieben. Nun ist zwar ein weißes Rechteck zu sehen, aber die Textur wird dennoch nicht darauf gerendered. Die eingehenden Videodaten werden übrigens konvertiert, zwischengespeichert und am Ende per Timer gezeichnet (wird aber noch umgeschrieben).
Christian
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Okay. Habs mir mal angeschaut und du hattest nen kleinen Gedankenfehler.
1. Du vergisst deine Textur zu erstellen. Du bist zwar die ganze Zeit fröhlich am FTextureID benutzen aber wo weißt du ihr einen Wert ungleich 0 zu? glGenTextures
2. Ich weiß zwar nicht was ConvertFromRGB macht aber wenn es lediglich das Format von RGB nach BGR umwandelt kannst du dir das Sparen. Eine OpenGL Textur versteht sowohl RGB als auch BGR. Du musst lediglich ein anderes Format angeben.
3. Du weißt die Daten deiner Textur immernoch im Callback (anderer Thread) zu. Da habe ich mich vielleicht falsch ausgedrückt aber du musst alles was mit OpenGL zu tun hat im selben Thread machen. Soll bedeuten du kopierst lediglich die Daten weg (FVideoData). Das Übergeben der Textur musst du dann entsprechend als erstes in dem RenderScene machen.
Du kannst den Timer auf auf 1 ms stellen. Das gibt keinen nennenswerten Unterschied abgesehen davon, dass er womöglich schneller reagiert. Aber letzten Endes würde ich wohl komplett auf den Timer verzichten wollen und irgendwie per Synchronize oder sonstigen Synchronisiergeschichten sofort mit dem echten Datenpointer (wenn möglich) die Textur updaten und dann in aller ruhe Zeichnen. Also zum Bleistifft wären da auch zwei 2 TEvent (kein OnIrgendetwas einer komponente) möglich.
grml... da schreibt man nen halben roman und dann ist lossy schneller *grmlgrml*
dann mal nur das was lossy noch nicht gesagt hat
Code:
procedure ConvertFromRGB(...)
[...]
pt[0]:= ps[0];
pt[1]:= ps[1];
pt[2]:= ps[2];
muss das nicht pt[0]^ := ps[0]^ heißen ?
Code:
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
[...]
glTexCoord2f(0,0); glVertex3f(-1.0,1.0,0.0);
glTexCoord2f(w,0); glVertex3f(1.0,1.0,0.0);
glTexCoord2f(w, h); glVertex3f(1.0,-1.0,0.0);
glTexCoord2f(0, h); glVertex3f(-1.0,-1.0,0.0);
das culling lässt du am besten ganz weg, da das hier nicht gebraucht wird und du solltest bei glTexCoord2f() nur werte von 0 bis 1 angeben, ansonsten wird die textur nämlich wiederholt.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
@Dexter. Hab aber noch ein paar Anmerkungen.
@Texturkoordinaten: Im Normalfall ist das 100%tig richtig aber bei Texture_rectangle gibt es eine Sonderbehandlung. Und zwar werden dort direkt die Pixel angegeben.
@BGRA: das ist ein neueres Format was unterstützt wird sobald Opengl 1.2 oder die Extension GL_RGBA unterstützt wird. Ich verwende in meinem Texturenloader nämlich ausschließlich dieses Format.
@Culling: Auf sehr alten Karten kann das aber schon einen Vorteil bringen. Also so TNT2 die noch nicht über T&L verfügen. Die müssen das dann alles doppelt rechnen. Genau wie Licht von zwei Seiten was standardmäßig aus ist. Sollte aber heutzutage keine Rolle mehr spielen.
@ConvertFromRGB: Wo war die denn? *tomatenvondenaugennehm* Aber damit könntest du auch recht haben. Aber wenn man das einfach nur so kopiert dann könnte man die Daten auch gleich am Stück kopieren als Move oder MemMove. Das geht dann noch ein bissel schneller. Hab aber wie gesagt die Methode gar nicht gefunden.
ok wußte ich noch nicht und wieder was dazu gelernt
ConvertToRGB ist die erste funktion in der umain.pas und konvertiert die BGR video daten nach BGRA daten für die textur.
funktioniert aber vielleicht, weil delphi das nicht immer so eng sieht mit dem "^"
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ah. Okay. Habe ich vollkommen übersehen. Wobei man natürlich auch direkt BGR an die Karte übergeben und damit render kann. Das verbraucht auch nicht so viel Speicher (der ja auch nicht genutzt wird) und sollte sogar noch schneller gehen als wenn man vorher erst noch einen Alphakanal hinzufügt. Natürlich dauert dann das übergeben etwas länger als wie wenn es BGRA ist aber im ganzen müsste es schneller sein.
PS: Ich habe mir das "^" konsequent angewöhnt um nicht irgendwann mal eine böse Überraschung zu erleben. Vergesse oder verdränge es regelmäßig, dass das eigentlich nicht notwendig ist.
Mitglieder in diesem Forum: Bing [Bot] und 3 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.