Sahnemi bir küp haritasına nasıl dönüştüreceğimizi anlamaya çalışıyorum. Bu konuda biraz takılı kaldım ve sizden biraz yardım isteyebileceğimi düşündüm. OpenGL'de yeniyim ve ilk kez FBO kullanıyorum.
Şu anda bir cubemap bmp dosyası kullanarak çalışan bir örnek var ve parça gölgelendirici samplerCube örnek türü GL_TEXTURE1 eklenir. Gölgelendirici kodunu hiç değiştirmiyorum. Ben sadece cubemap bmp dosyasını yükleme ve bir cubemap render için aşağıdaki kodu kullanmaya çalışıyorum olmayacak aslında değiştiriyorum.
Aşağıda, dokuyu tekrar GL_TEXTURE1'e eklediğimi görebilirsiniz. Üniformayı ayarladığımda şöyle olur:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
üzerinden parça gölgelendiricimden erişebilir uniform samplerCube Cubemap
.
Aşağıdaki işlevi böyle çağırıyorum:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Şimdi, aşağıdaki çizim döngüsünde + x, -x, + y, -y, + z, -z eksenini aşağıya bakmak için görünüm yönünü değiştirmediğimi anlıyorum. Gerçekten bunu uygulamadan önce ilk önce çalışan bir şey görmek istiyordum. Kod en azından benim nesne üzerinde bir şey görmek gerektiğini düşündüm.
Hiçbir şey görmüyorum, sadece düz siyah. Arka planımı beyaz yaptım, nesne siyah. Sadece kübemap dokusunu örneklemek için aydınlatmayı ve renklendirmeyi kaldırdım ve hala siyahım.
Ben GL_RGB8, GL_RGBA olan benim doku ayarlarken sorun biçim türleri olabilir düşünüyorum ama ben de denedim:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Bir çerçeve arabelleğe eklenen bir dokuya render yaptığımız için bunun standart olacağını düşündüm, ancak farklı enum değerleri kullanan farklı örnekler gördüm.
Ayrıca, küp haritasını kullanmak istediğim her çizim çağrısında küp haritası dokusunu ciltlemeyi denedim:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Ayrıca, çoğu örnekte gördüğüm FBO için bir derinlik tamponu oluşturmuyorum, çünkü sadece küp haritam için renk tamponunu istiyorum. Aslında sorunun bunun olup olmadığını görmek için bir tane ekledim ve hala aynı sonuçları aldım. Denediğimde bunu geçiştirebilirdim.
Beni doğru yönde gösterebilecek herhangi bir yardım takdir edilecektir.
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
İşlevinizin gerçekten görünür bir şey çizdiğini test ettiniz mi? İşlev aslında bir şey çiziyor mu?drawSpheres
Yalnızca çerçeveyi temizlemeyi değiştirirseniz ne olur ?