Estou tentando descobrir como renderizar minha cena em um mapa de cubo. Fiquei um tempo preso nisso e pensei em pedir ajuda a vocês. Eu sou novo no OpenGL e esta é a primeira vez que estou usando um FBO.
Atualmente, tenho um exemplo de uso de um arquivo cmp de mapa de cubos e o tipo de amostra samplerCube no shader de fragmento está anexado a GL_TEXTURE1. Não estou mudando o código do sombreador. Estou apenas mudando o fato de que não chamarei a função que estava carregando o arquivo bmp do cubemap e tentando usar o código abaixo para renderizar em um mapa do cubo.
Você pode ver abaixo que também estou anexando a textura novamente ao GL_TEXTURE1. É assim que eu coloco o uniforme:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
ele pode acessá-lo no meu fragment shader via uniform samplerCube Cubemap
.
Estou chamando a função abaixo da seguinte maneira:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Agora, percebo no loop de desenho abaixo que não estou mudando a direção da vista para olhar para o eixo + x, -x, + y, -y, + z, -z. Eu realmente só queria ver algo funcionando primeiro antes de implementar isso. Imaginei que deveria pelo menos ver algo no meu objeto da maneira que o código é agora.
Não estou vendo nada, apenas preto. Eu fiz meu fundo branco ainda o objeto é preto. Eu removi a iluminação e a coloração para provar apenas a textura do cubemap e ainda preta.
Eu estou pensando que o problema pode ser os tipos de formato ao definir minha textura que é GL_RGB8, GL_RGBA, mas também tentei:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Eu pensei que isso seria padrão, pois estamos renderizando uma textura anexada a um framebuffer, mas vi exemplos diferentes que usam valores de enumeração diferentes.
Eu também tentei vincular a textura do mapa do cubo em todas as chamadas de desenho que eu estou querendo usar o mapa do cubo:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Além disso, não estou criando um buffer de profundidade para o FBO que vi na maioria dos exemplos, porque estou apenas querendo o buffer de cores para o meu mapa de cubos. Na verdade, adicionei um para ver se esse era o problema e ainda obtive os mesmos resultados. Eu poderia ter estragado tudo quando tentei.
Qualquer ajuda que possa me apontar na direção certa seria 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
função realmente desenha algo visível? A função realmente desenha alguma coisa? O que acontece se você mudardrawSpheres
para limpar o buffer de quadros?