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?