Die ARB-Version gehört zur Extension GL_ARB_multitexture, die andere zum OpenGL-Kern. Solche Funktionen können sich unterschiedlich Verhalten, darum haben die ja einen anderen Namen. Das lesen der Spezifikation hilft: Im Fall von glActiveTexture gehört diese seit OpenGL 1.2.1 zum Kern. Sofern du also OpenGL >= 1.2.1 voraussetzt brauchst du nicht die Extension benutzen. Falls du z.B. auch OpenGL 1.2.0 zulassen willst musst du beim Start deiner Anwendung testen ob die Extension GL_ARB_multitexture verfügbar ist und glActiveTextureARB statt glActiveTexture benutzen. In jedem Fall solltest du eine Extension entweder konsequent benutzen oder nicht. D.h. alles was eine Extension mitbringt benutzen oder gar nichts davon, Mischungen können gefährlich werden. Das erklärt sich vielleicht besser am Beispiel von Shadern: Einen Shader mit der Funktion der Extension compilieren aber dann später mit der Funktion des OpenGL 2.0 Kerns linken könnte (muss aber nicht) zu Problemen führen.
hab noch ne kurze Shaderfrage: Wenn ich meinem Shader eine Matrix mittels z.b. glUniformMatrix4fv(glGetUniformLocation(shader.ProgramObject, 'TexGenMat1'), 1, false, @tMat); zuweise, wird diese dann sofort in den Grafikspeicher kopiert, oder wird nur der Pointer gespeichert?
Die Daten werden auf jeden Fall kopiert. Ob sie auch direkt in den Grafikspeicher geschoben werden ist nicht definiert. => Du kannst den Speicherbereich anschließend ruhig freigeben oder anderweitig nutzen. (Was vermutlich deine eigentliche Frage war)
also ich bin jetzt schon stunden am suchen doch finde den Fehler nich. Für einen Projektor hab ichs ja bereits mit Shadern hinbekommen. Doch für 2 hat es einfach nicht hin. Hier mal der entscheidene Codeabschnitt:
Code:
ProjectorPersp := lights[i].BeamAngle * lights[i].Zoom + 2; //Abstrahlwinkel glMatrixMode(GL_TEXTURE); glPushMatrix; glLoadIdentity; // Texturenmatrix skalieren und an 0..1 anpassen glTranslatef(0.5, 0.5, 0); glScalef(0.5, 0.5, 1); // Projekorperspektive setzen gluPerspective(ProjectorPersp, 1, 0.1, 1); MatrixInvert(lights[i].texMatrix); //ModelView Matrix aus sicht des Projektors glMultMatrixf(@lights[i].texMatrix); glMultMatrixf(@NormalCamMatrix); //Modelview der Cam glGetFloatv(GL_TEXTURE_MATRIX, @tMatArr[i]);
if i=0 then glUniformMatrix4fv(glGetUniformLocation(shader.ProgramObject, 'TexGenMat0'), 1, false, @tMatArr[0]);
if i=1 then glUniformMatrix4fv(glGetUniformLocation(shader.ProgramObject, 'TexGenMat1'), 1, false, @tMatArr[1]);
glPopMatrix;
Dieser läuft in einer schleife (aktuell nur 2x) und dann wird die Sache gerendert. Der 1. Projektor, quasi der erste durchlauf funktioniert top, doch beim zweitem mal stimmt die erzeuge Texturmatrix nicht mehr.. Durch das Push/Pop dürfte sich jedoch nix geändert haben oder?
Wie sieht den der Shader aus? Ich würde da einen Copy&Paste-Fehler vermuten. D.h. bei der 2. Projektion benutzt du irgendwelche Daten die zur 1. Projektion gehören. Woran machst du fest das die zweite Texturmatrix nicht richtig ist?
Mitglieder in diesem Forum: 0 Mitglieder 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.