Saya mencoba mencari cara merender adegan saya ke peta kubus. Saya sudah terjebak dalam hal ini sebentar dan berpikir saya akan meminta bantuan kalian. Saya baru mengenal OpenGL dan ini adalah pertama kalinya saya menggunakan FBO.
Saat ini saya memiliki contoh kerja menggunakan file bmp cubemap, dan tipe sampel samplerCube dalam shader fragmen dilampirkan ke GL_TEXTURE1. Saya tidak mengubah kode shader sama sekali. Saya hanya mengubah fakta bahwa saya tidak akan memanggil fungsi yang memuat file bmp cubemap dan mencoba menggunakan kode di bawah ini untuk merender ke cubemap.
Anda dapat melihat di bawah ini bahwa saya juga melampirkan tekstur lagi ke GL_TEXTURE1. Ini terjadi ketika saya mengatur seragam:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
dapat mengaksesnya di fragmen shader saya via uniform samplerCube Cubemap
.
Saya memanggil fungsi di bawah ini seperti ini:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Sekarang, saya menyadari di loop gambar di bawah ini bahwa saya tidak mengubah arah tampilan untuk melihat ke bawah + x, -x, + y, -y, + z, -z axis. Saya benar-benar hanya ingin melihat sesuatu berfungsi terlebih dahulu sebelum mengimplementasikannya. Saya pikir saya setidaknya harus melihat sesuatu pada objek saya seperti kode sekarang.
Saya tidak melihat apa-apa, hanya hitam lurus. Saya telah membuat latar belakang saya tetap putih objeknya hitam. Saya telah menghapus pencahayaan, dan mewarnai hanya untuk mencicipi tekstur cubemap dan masih hitam.
Saya pikir masalahnya mungkin tipe format ketika mengatur tekstur saya yaitu GL_RGB8, GL_RGBA tapi saya juga sudah mencoba:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Saya pikir ini akan menjadi standar karena kita membuat tekstur yang melekat pada framebuffer, tetapi saya telah melihat contoh berbeda yang menggunakan nilai enum yang berbeda.
Saya juga telah mencoba mengikat tekstur peta kubus di setiap panggilan undian yang ingin saya gunakan peta kubus:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Juga, saya tidak membuat buffer kedalaman untuk FBO yang saya lihat di sebagian besar contoh, karena saya hanya ingin buffer warna untuk peta kubus saya. Saya benar-benar menambahkan satu untuk melihat apakah itu masalahnya dan masih mendapatkan hasil yang sama. Aku bisa membayangkan itu ketika aku mencoba.
Setiap bantuan yang dapat mengarahkan saya ke arah yang benar akan dihargai.
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
fungsi Anda benar-benar menarik sesuatu yang terlihat? Apakah fungsi sebenarnya menggambar sesuatu? Apa yang terjadi jika Anda berubahdrawSpheres
untuk menghapus framebuffer?