Sto cercando di capire come rendere la mia scena su una mappa cubica. Sono stato bloccato su questo per un po 'e ho pensato che avrei chiesto aiuto a voi ragazzi. Sono nuovo di OpenGL e questa è la prima volta che utilizzo un FBO.
Attualmente ho un esempio funzionante di utilizzo di un file bmp cubemap e il tipo di campione samplerCube nello shader di frammento è collegato a GL_TEXTURE1. Non sto cambiando affatto il codice shader. Sto solo cambiando il fatto che non chiamerò la funzione che stava caricando il file bmp di cubemap e provando a usare il codice seguente per eseguire il rendering su una cubemap.
Di seguito puoi vedere che allego di nuovo anche la trama a GL_TEXTURE1. Questo è così quando ho impostato l'uniforme:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
può accedervi nel mio shader di frammenti tramite uniform samplerCube Cubemap
.
Sto chiamando la seguente funzione in questo modo:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Ora, mi rendo conto nel ciclo di disegno qui sotto che non sto cambiando la direzione della vista per guardare in basso l'asse + x, -x, + y, -y, + z, -z. Volevo davvero vedere qualcosa che funzionasse prima di implementarlo. Ho pensato che avrei dovuto almeno vedere qualcosa sul mio oggetto come è ora il codice.
Non vedo nulla, solo nero. Ho reso il mio sfondo bianco ancora l'oggetto è nero. Ho rimosso l'illuminazione e la colorazione per campionare solo la trama della mappa cubica e ancora nera.
Sto pensando che il problema potrebbe essere il tipo di formato durante l'impostazione della mia trama che è GL_RGB8, GL_RGBA ma ho anche provato:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Ho pensato che sarebbe stato standard dato che stiamo eseguendo il rendering su una trama collegata a un framebuffer, ma ho visto diversi esempi che usano valori enum differenti.
Ho anche provato a legare la trama della mappa cubo in ogni chiamata di disegno che voglio usare la mappa cubo:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Inoltre, non sto creando un buffer di profondità per l'FBO che ho visto nella maggior parte degli esempi, perché desidero solo il buffer di colore per la mia mappa del cubo. In realtà ne ho aggiunto uno per vedere se quello era il problema e ho comunque ottenuto gli stessi risultati. Potrei rovinare tutto quando ho provato.
Qualsiasi aiuto che possa indicarmi la giusta direzione sarebbe apprezzato.
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
funzione disegna effettivamente qualcosa di visibile? La funzione disegna davvero qualcosa? Cosa succede se cambidrawSpheres
per cancellare il framebuffer?