RGB Array darstellen
-
Hi!
Ich habe folgenden Beitrag bereits im Themenbereich WinApi gepostet. Da ich aber noch keine Antwort bekommen habe versuch ichs nochmal hier:Ich bin C++ Anfänger und habe es jetzt endlich geschafft meinen in Python programmierten Path Tracer in C++ zu übersetzten.
Diesen habe ich als Konsolen Applikation geschrieben. Die RGB Daten für jeden Pixel speichere ich in einem Array der Länge (Bild breite * Bild hoehe * 3). Am Ende des renderns speichere ich diesen Array als Portable Pixel Map (PPM).
Soweit so gut!Mein(e) Frage/Anliegen:
Wie kann ich den Entstehungsprozess am besten "live" darstellen?
Ich suche eine schnelle Variante einen Array (Bild breite * Bild hoehe * 3 (3 für rgb)) als Grafik in einer GUI darzustellen, ohne den Array immer als PPM-Datei zu speichern und diese Datei dann in der GUI darzustellen.
(Der Renderprozess soll weiterhin in der Konsole stattfinden)Leonard
-
Du könntest OpenGL verwenden. Das ist schnell und portabel:
#include <cstdlib> #include <ctime> #include <GL/glut.h> #define WIDTH 320 #define HEIGHT 240 #define BPP 3 #define SIZE (WIDTH*HEIGHT*BPP) void draw() { static char *buf = NULL; if(!buf) { buf = new char[SIZE]; srandom(time(NULL)); for(unsigned int c = 0; c < SIZE; c++) buf[c] = random() % 0xFF; glEnable(GL_TEXTURE_RECTANGLE_ARB); } glClear(GL_COLOR_BUFFER_BIT); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture); glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, buf); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glBegin(GL_QUADS); glTexCoord2i(0, HEIGHT); glVertex2f(-1, -1); glTexCoord2i(WIDTH, HEIGHT); glVertex2f(1, -1); glTexCoord2i(WIDTH, 0); glVertex2f(1, 1); glTexCoord2i(0, 0); glVertex2f(-1, 1); glEnd(); glDeleteTextures(1, &texture); glFlush(); glutSwapBuffers(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("Window"); glutDisplayFunc(draw); glutMainLoop(); return 0; }
-
Ich bekomme eine Fehlermeldung!
Er findet OpenGL nicht (GL/glut.h: No such file or directory). Ich dachte das Sei eigentlich standardmäßig vorhanden!
-
versuch mal den pixeltoaster, da sind auch ein paar beispiele dabei.
-
Ich hab nachgesehen und festgestellt, dass sich im GL Ordner nur drei Dateien befinden: gl.h, glext.h, glu.h.
Von glut.h ist keine Spur.
Was soll ich machen??
-
-
dranoel schrieb:
Ich hab nachgesehen und festgestellt, dass sich im GL Ordner nur drei Dateien befinden: gl.h, glext.h, glu.h.
Von glut.h ist keine Spur.
Was soll ich machen??Einfach freeglut installieren: http://www.transmissionzero.co.uk/software/freeglut-devel/ :3
-
Mach einfach ein Fenster und zeichne deine Daten mit StretchDIBits() rein.
-
Vielen Dank für die Antworten! OpenGl funktioniert jetzt.
@Husky Puppy: leider funktioniert deine Lösung immer noch nicht.
Ich habs jetzt soweit zum laufen bekommen:
#include <windows.h> #include <gl\gl.h> #include <gl\glut.h> #include <ctime> int width = 320; int height = 240; int size = width * height * 3; void display(void); int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB); glutInitWindowSize(width ,height); glutInitWindowPosition(100,100); glutCreateWindow("Vorschau"); glutDisplayFunc(display); glutMainLoop(); return 0; } void display(void) { float buf[size]; for (int i = 0; i < size; i++) { buf[i] = (rand()/(double)RAND_MAX); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawPixels(width, height, GL_RGB, GL_FLOAT, buf); glutSwapBuffers(); }
-
Freut mich. :3
Wo genau ist das Problem mit meiner Lösung?
-
Erst einmal funktioniert random() nicht, das musste ich durch rand() ersetzen. Und dann gab es Ärger mit glEnable(GL_TEXTURE_RECTANGLE_ARB);.
Kann ich eigentlich irgendwo in OpenGL den Fenster-Style konfigurieren?? Ich würde nämlich gerne die Icons zum minimieren, maximieren und schließen verbergen (WS_CAPTION).
Und ist es möglich Farbwerte im Bereich von 0 bis 255, statt 0 bis 1 einzustellen? Ich möchte ungern jedes mal umrechnen.
-
dranoel schrieb:
Ersteinam funktioniert random() nicht, das musste ich durch rand ersetzen.
Ups, scheint wohl nicht in jeder C Library zu sein. ^^>
dranoel schrieb:
Und dann gab es Ärger mit glEnable(GL_TEXTURE_RECTANGLE_ARB);.
Der Code ist schon ein wenig älter. ^^> Es sollte funktionieren, wenn du
GL_TEXTURE_RECTANGLE_ARB
durchGL_TEXTURE_RECTANGLE
ersetzt. :3dranoel schrieb:
Kann ich eigentlich irgendwo in OpenGL den Fenster-Style konfigurieren?? Ich würde nämlich gerne die Icons zum minimieren, maximieren und schließen verbergen (WS_CAPTION).
Mit OpenGL hat das nichts zu tun, sondern mit der Library, mit der das Fenster erzeugt wird. Wir haben hier glut verwendet, mit der das leider nicht geht. Mit WGL geht das aber sicherlich, allerdings weiß ich nicht wie - ich benutze normalerweise GLX.
dranoel schrieb:
Und ist es möglich Farbwerte im Bereich von 0 bis 255, statt 0 bis 1 einzustellen? Ich möchte ungern jedes mal umrechnen.
Genau das tun wir doch. ^^ Jedes Byte in
buf
entspricht einem Farbkanal (R, G odereines Pixels und kann Werte zwischen 0 und 255 annehmen. :3
-
Genau das tun wir doch. ^^ Jedes Byte in buf entspricht einem Farbkanal (R, G oder
eines Pixels und kann Werte zwischen 0 und 255 annehmen. :3
Jein! Die Farbe (0,0,255) sieht genau so aus wie die Farbe (0,0,1) (Blau). Das Maximum für einen RGB Wert ist also 1 und nicht 255.
Jetzt könnte man ja einfach den Farbwert zwischen 0 und 255 durch 255 teilen, aber das bedeutet ja wieder zusätzlichen Rechenaufwand.
Kann man eventuell eine Modus ändern, sodass Farbwerte zwischen 0 und 255 aktiv sind??
-
dranoel schrieb:
Jein! Die Farbe (0,0,255) sieht genau so aus wie die Farbe (0,0,1) (Blau). Das Maximum für einen RGB Wert ist also 1 und nicht 255.
Jetzt könnte man ja einfach den Farbwert zwischen 0 und 255 durch 255 teilen, aber das bedeutet ja wieder zusätzlichen Rechenaufwand.
Kann man eventuell eine Modus ändern, sodass Farbwerte zwischen 0 und 255 aktiv sind??Oh, ich hatte mir deinen Code gar nicht näher angeschaut. ^^> Versuchs mal so:
void display(void) { char buf[size]; for (int i = 0; i < size; i++) { buf[i] = (rand() % 0xFF); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawPixels(width, height, GL_RGB, GL_BYTE, buf); glutSwapBuffers(); }
:3