J'essaie de comprendre comment rendre ma scène sur une carte de cube. Je suis coincé là-dessus depuis un moment et j'ai pensé que je vous demanderais de l'aide. Je suis nouveau sur OpenGL et c'est la première fois que j'utilise un FBO.
J'ai actuellement un exemple de travail d'utilisation d'un fichier bmp cubemap, et le type d'échantillon samplerCube dans le fragment shader est attaché à GL_TEXTURE1. Je ne change pas du tout le code du shader. Je change juste le fait que je n'appellerai pas la fonction qui chargeait le fichier bmp de cubemap et essayait d'utiliser le code ci-dessous pour effectuer un rendu sur un cubemap.
Vous pouvez voir ci-dessous que je rattache également la texture à GL_TEXTURE1. C'est ainsi lorsque je mets l'uniforme:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
il peut y accéder via mon fragment shader via uniform samplerCube Cubemap
.
J'appelle la fonction ci-dessous comme ceci:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Maintenant, je réalise dans la boucle de dessin ci-dessous que je ne change pas la direction de la vue pour regarder vers le bas sur l'axe + x, -x, + y, -y, + z, -z. Je voulais vraiment voir quelque chose fonctionner avant de l'implémenter. J'ai pensé que je devrais au moins voir quelque chose sur mon objet comme le code est maintenant.
Je ne vois rien, juste noir droit. J'ai rendu mon arrière-plan blanc, mais l'objet est noir. J'ai supprimé l'éclairage et la coloration pour simplement échantillonner la texture cubemap et toujours noir.
Je pense que le problème pourrait être les types de format lors de la définition de ma texture qui est GL_RGB8, GL_RGBA mais j'ai également essayé:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Je pensais que ce serait standard car nous rendons une texture attachée à un framebuffer, mais j'ai vu différents exemples qui utilisent différentes valeurs d'énumération.
J'ai également essayé de lier la texture de la carte du cube dans chaque appel de dessin que je souhaite utiliser la carte du cube:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
De plus, je ne crée pas de tampon de profondeur pour le FBO que j'ai vu dans la plupart des exemples, car je ne veux que le tampon de couleur pour ma carte de cube. J'ai en fait ajouté un pour voir si c'était le problème et j'ai toujours obtenu les mêmes résultats. J'aurais pu tromper cela quand j'ai essayé.
Toute aide pouvant me diriger dans la bonne direction serait appréciée.
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
fonction dessine réellement quelque chose de visible? La fonction dessine-t-elle réellement quelque chose? Que se passe-t-il si vous changezdrawSpheres
pour simplement effacer le tampon d'image?