Könnte jemand bitte geben Sie mir ein einfaches Beispiel für die Vertex und Fragment-Shader interagieren, um mehrere polys mit verschiedenen Texturen zu machen?
Googeln Sie nach GLSL-Tutorials. Beispiele wurden bereits geschrieben, und es gibt keinen Grund, sie noch einmal für Sie zu schreiben. Oder laden Sie das NVidia OpenGL SDK herunter und untersuchen Sie es. OpenGL.org empfiehlt auch Bücher. Das "Orange Book" behandelt Shader.
die in 256x256 aufgeteilt ist
Traditionell wird empfohlen, das Gegenteil zu tun - nehmen Sie alle Texturen, die Sie können, und kombinieren Sie sie in einem einzigen "Atlas"-Textur, die vorzugsweise etwas wie 16384x16384 ist - zu minimieren Zustand wechseln.
Was ich will, ist ein texturiertes Modell mit einem Shader zu zeichnen, mit mehreren Texturen, aber das Modell ist ein flacher Hintergrund. Es ist ein großes (1600x800 oder so) Bild
1600x800 passen vollständig in die Textur auf so ziemlich jeder Hardware seit Riva TNT 2 pro. Wenn du dich um "verschwendeten" Texturspeicher sorgst, dann unterstützen viele Karten Non-Power-of-2-Texturen. Allerdings haben Non-Power-of-2-Texturen normalerweise Einschränkungen, und auf einige Hardware (bestimmte Ati-Karten + Treiber), die eine solche Textur verwenden, führen zu einem Sturzflug der FPS. D.h. von 200..400 auf 40. Das ist es nicht wert. Auf Hardware mit sogar 256MB VRam sind ungenutzte 40 Prozent der Textur eine Mikrooptimierung. Und dann wiederum könnte man Textur-Atlanten verwenden und den "verschwendeten" Platz mit etwas Nützlichem füllen, wenn man mit der Vram-Nutzung geizt. Denken Sie auch daran, dass Sie nie wissen, wie effizient Fahrer verwendet den Videospeicher.
Ich möchte das alles im Shader machen, ohne die Textur für jeden Chunk auf der CPU binden zu müssen,
Das können Sie nicht tun. Shader binden keine Texturen. Sie verwenden Texturen, die bereits gebunden wurden.
Ich bin nicht sicher, ob es funktioniert, da die Shader derzeit nicht kompiliert werden können,
Dann lassen Sie sie kompilieren und fragen Sie erneut. Es ist nicht möglich, Ihnen zu helfen, ohne Ihren Shader oder Ihre Fehlermeldung zu sehen. Sie wissen doch, dass Shader-Compiler erzeugt Fehlermeldungen richtig?
Nachdem ich frustriert war, weil die Pipeline mit festen Funktionen in Python langsam ist
Erwägen Sie den Wechsel zu einer kompilierten Sprache wie C oder C++. Sie können leicht 200..400 Bilder pro Sekunde mit rohen festen Funktion opengl in C/C++-Anwendung ("Dungeon Crawler") ohne Verwendung von Puffern oder Display-Listen zu bekommen - IF Sie verwenden den richtigen Algorithmus zur Entfernung verdeckter Flächen (und vsync ist deaktiviert) UND Ihre Texturen sind mip-mapped. Bekannte "fixed function" Anwendungen sind Quake 1..3, Half-Life 1, Cube und viele andere Spiele, die rasend schnell sind. Das heißt - wenn es langsam ist, ist es Ihre Schuld.
Im Gegensatz zu C/C++ hat Python einen größeren Overhead für Funktionsaufrufe - das Ausführen von Bytecode, das Extrahieren von Werten unbekannten Typs aus einer Liste/einem Tupel (die/der "alles" enthalten kann) und das anschließende Ablegen als Float in etwas wie glVertex3f, während es schließlich an einen nativen API-Aufruf weitergeleitet wird, wird langsamer sein als ein ähnlicher C/C++-Aufruf, der keine Zwischenschritte hat. Sie können dem entgegenwirken, indem Sie Anzeigelisten oder Pufferobjekte verwenden, aber für mich ist es die Mühe nicht wert. Die Verwendung einer bestimmten Sprache für eine bestimmte Aufgabe ist jedoch eine Frage der persönlichen Vorliebe.
--EDIT--
Aber wenn Shader keine Texturen binden können, wie funktioniert dann Multitexturierung?
Es gibt N Texturstufen (mindestens 2 - siehe glGet/GL_MAX_TEXTURE_COORDS/GL_MAX_TEXTURE_UNITS), Sie setzen mehrere Texturen auf einmal. Siehe glActiveTexture . Ohne Shader (feste Funktion) geben Sie die Farboperation für jede Stufe mit glTexEnv . Mit Shadern legen Sie mehrere Texturen fest und bestimmen, welcher Sampler welche Texturstufe verwendet, indem Sie glUniform1i/glUniform1v und lesen dann mit Sampler2D und ähnlichen Funktionen Daten aus ihnen im Shader. Shader kann keine Texturen wechseln. Er kann Texturen verwenden, die bereits von Ihrem Programm eingestellt wurden. Der Shader hat keine Kenntnis über Texturen außerhalb des Shaders. Technisch gesehen kennt der Shader nicht einmal eine "Textur", er hat einen "Sampler", der zum Lesen von Daten verwendet wird.
Oder Textur-Sampling? Shader müssen in der Lage sein, Texturen auszuwählen/zu verändern...
Shader schaltet oder wählt Texturen überhaupt nicht aus. Dieser Teil wird von Ihrem Programm erledigt. Für weitere Informationen lesen Sie die OpenGL-Spezifikationen und die GLSL-Spezifikationen für Ihre Version von opengl/glsl. Beide stehen auf der Website opengl.org im Menü "Dokumentation" zum Download bereit.
Wie ich schon sagte, brauchen Sie an dieser Stelle ein GLSL-Tutorial oder ein Buch. Beide sind leicht zu finden. Holen Sie sich entweder ein und halten Sie es zu lesen, bis Sie "get" es. Im Moment sieht es nicht so aus, als hättest du deine Hausaufgaben gemacht und versucht, einen einfachen Shader mit Hilfe eines Buches oder Tutorials zu erstellen. Wenn Sie kein Buch finden können, dann NVidia OpenGL SDK hatte viele Beispiele (in C/C++, aber es ist nicht so schwer, sie zu konvertieren).