Ich versuche herauszufinden, wie ich meine Szene auf eine Würfelkarte rendern kann. Ich war ein bisschen dabei und dachte, ich würde euch um Hilfe bitten. Ich bin neu in OpenGL und benutze zum ersten Mal einen FBO.
Ich habe derzeit ein funktionierendes Beispiel für die Verwendung einer Cubemap-BMP-Datei, und der SamplerCube-Beispieltyp im Fragment-Shader ist an GL_TEXTURE1 angehängt. Ich ändere den Shader-Code überhaupt nicht. Ich ändere nur die Tatsache, dass ich nicht die Funktion aufrufe, mit der die Cubemap-BMP-Datei geladen wurde, und versuche, den folgenden Code zum Rendern in eine Cubemap zu verwenden.
Sie können unten sehen, dass ich die Textur auch wieder an GL_TEXTURE1 anhänge. Dies ist so, wenn ich die Uniform setze:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
es kann in meinem Fragment Shader über darauf zugreifen uniform samplerCube Cubemap
.
Ich rufe die folgende Funktion wie folgt auf:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Jetzt merke ich in der Zeichenschleife unten, dass ich die Blickrichtung nicht ändere, um auf die + x, -x, + y, -y, + z, -z-Achse zu schauen. Ich wollte wirklich nur, dass etwas zuerst funktioniert, bevor ich das umsetzte. Ich dachte, ich sollte zumindest etwas auf meinem Objekt so sehen, wie der Code jetzt ist.
Ich sehe nichts, nur glattes Schwarz. Ich habe meinen Hintergrund weiß gemacht, trotzdem ist das Objekt schwarz. Ich habe die Beleuchtung und das Kolorieren entfernt, um nur die Cubemap-Textur und immer noch Schwarz abzutasten.
Ich denke, das Problem könnten die Formattypen sein, wenn ich die Textur GL_RGB8, GL_RGBA einstelle, aber ich habe es auch versucht:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Ich dachte, dies wäre Standard, da wir eine Textur rendern, die an einen Framebuffer angehängt ist, aber ich habe verschiedene Beispiele gesehen, die unterschiedliche Enum-Werte verwenden.
Ich habe auch versucht, die Cube-Map-Textur in jedem Draw-Aufruf zu binden, für den ich die Cube-Map verwenden möchte:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Außerdem erstelle ich keinen Tiefenpuffer für den FBO, den ich in den meisten Beispielen gesehen habe, weil ich nur den Farbpuffer für meine Cube-Map haben möchte. Ich habe tatsächlich eine hinzugefügt, um zu sehen, ob dies das Problem ist, und trotzdem die gleichen Ergebnisse erzielt. Ich hätte das verfälschen können, als ich es versuchte.
Jede Hilfe, die mich in die richtige Richtung lenken kann, wäre dankbar.
GLuint renderToCubeMap(int size, GLenum InternalFormat, GLenum Format, GLenum Type)
{
// color cube map
GLuint textureObject;
int face;
GLenum status;
//glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, &textureObject);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureObject);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (face = 0; face < 6; face++) {
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, InternalFormat, size, size, 0, Format, Type, NULL);
}
// framebuffer object
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textureObject, 0);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
printf("%d\"\n", status);
printf("%d\n", GL_FRAMEBUFFER_COMPLETE);
glViewport(0,0,size, size);
for (face = 1; face < 6; face++) {
drawSpheres();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, textureObject, 0);
}
//Bind 0, which means render to back buffer, as a result, fb is unbound
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return textureObject;
}
drawSpheres
Funktion tatsächlich etwas Sichtbares zeichnet? Zeichnet die Funktion tatsächlich etwas? Was passiert, wenn SiedrawSpheres
den Framebuffer löschen?