Estoy tratando de descubrir cómo representar mi escena en un mapa de cubos. Estuve atascado en esto por un momento y pensé que les pediría ayuda. Soy nuevo en OpenGL y esta es la primera vez que uso un FBO.
Actualmente tengo un ejemplo práctico de uso de un archivo bmp cubemap, y el tipo de muestra samplerCube en el sombreador de fragmentos está adjunto a GL_TEXTURE1. No estoy cambiando el código del sombreador en absoluto. Solo estoy cambiando el hecho de que no llamaré a la función que estaba cargando el archivo bmp de cubemap e intento usar el código siguiente para representar un mapa de cubos.
Puede ver a continuación que también adjunto la textura nuevamente a GL_TEXTURE1. Esto es así cuando configuro el uniforme:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
Puede acceder a él en mi fragment shader a través de uniform samplerCube Cubemap
.
Llamo a la siguiente función así:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Ahora, me doy cuenta en el siguiente ciclo de dibujo que no estoy cambiando la dirección de la vista para mirar hacia abajo el eje + x, -x, + y, -y, + z, -z. Realmente solo quería ver que algo funcionara antes de implementarlo. Pensé que al menos debería ver algo en mi objeto como está ahora el código.
No veo nada, solo negro. He hecho mi fondo blanco aún, el objeto es negro. Eliminé la iluminación y el color para probar solo la textura del mapa de cubos y aún negro.
Estoy pensando que el problema podría ser el tipo de formato al configurar mi textura, que es GL_RGB8, GL_RGBA, pero también he intentado:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Pensé que esto sería estándar ya que estamos renderizando a una textura adjunta a un framebuffer, pero he visto diferentes ejemplos que usan diferentes valores de enumeración.
También he intentado vincular la textura del mapa de cubos en cada llamada de dibujo que quiero usar el mapa de cubos:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Además, no estoy creando un búfer de profundidad para el FBO que vi en la mayoría de los ejemplos, porque solo quiero el búfer de color para mi mapa de cubos. De hecho, agregué uno para ver si ese era el problema y aún obtuve los mismos resultados. Podría haberlo falsificado cuando lo intenté.
Cualquier ayuda que pueda orientarme en la dirección correcta sería apreciada.
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
función realmente dibuja algo visible? ¿La función realmente dibuja algo? ¿Qué sucede si cambiasdrawSpheres
para borrar el framebuffer?Respuestas:
Bueno, no puedo garantizar que esto te ayude a descubrir qué está pasando. Simplemente no ha publicado suficiente información sobre lo que está haciendo para localizar cualquier error en particular. Aunque puedo corregir una cosa tuya muy rápido:
Esto solo llamará
drawSpheres
cinco veces. Supongo que querías llamarlo 6 veces.Pero puedo publicar una respuesta de trabajo. Tenga en cuenta que este código está diseñado para ejecutarse junto con mi serie de tutoriales , por lo que hace referencia al código que no está presente. Pero esto es principalmente cosas como crear mallas y demás; Nada realmente importante.
Aquí están los puntos más destacados. Los sombreadores para el objeto de esfera principal.
Sombreador de vértices:
Sombreador de fragmentos:
La creación de la textura del mapa de cubos que se utilizará como destino de representación:
De hecho, relleno la textura con datos (en lugar de pasar NULL a glTexImage2D) como una ayuda de depuración. Asegura que todo estaba funcionando antes de comenzar a usar la textura como un objetivo de renderizado.
Además, tenga en cuenta que proporciono BASE_LEVEL y MAX_LEVEL. Yo siempre hago con mis texturas inmediatamente después de la creación. Es solo un buen hábito, ya que OpenGL puede ser exigente a veces sobre la integridad de la textura y la pirámide mipmap. En lugar de recordar las reglas, simplemente las configuré religiosamente con los valores correctos.
Aquí está la función principal de dibujo:
Esto hace referencia a
DrawFace
, que dibuja la cara dada del mapa de cubos. Eso se implementa de la siguiente manera:Esta función hace referencia a un conjunto de tablas globales que utilizo para dar a cada cara un color de fondo distinto, un color de esfera distinto y para colocar la esfera (en el espacio de la cámara) correctamente para esa cara.
Los puntos más destacados
DrawFace
son estos.Como regla general, a menos que tenga cierto conocimiento de que el estado está establecido, lo establezco. Establezco la ventana gráfica cada vez que llamo
DrawFace
. Establezco la matriz de proyección cada vez. Esos son superfluos; Podría haberlos configurado nuevamentedisplay
antes del ciclo que llamaDrawFace
, tal como lo hago con el FBO actual y el buffer de renderizado de profundidad.Pero también elimino los buffers, que son diferentes para cada cara (ya que cada cara tiene un color diferente).
fuente