ฉันพยายามหาวิธีทำให้ฉากของฉันเป็นแผนที่ลูกบาศก์ ฉันติดอยู่กับเรื่องนี้และคิดว่าฉันจะขอความช่วยเหลือจากพวกคุณ ฉันใหม่กับ OpenGL และนี่เป็นครั้งแรกที่ฉันใช้ FBO
ขณะนี้ฉันมีตัวอย่างการทำงานของการใช้ไฟล์ cubemap bmp และประเภทตัวอย่าง samplerCube ใน shader ที่ต่อกับ GL_TEXTURE1 ฉันไม่ได้เปลี่ยนรหัส shader เลย ฉันแค่เปลี่ยนความจริงที่ว่าฉันจะไม่เรียกฟังก์ชันที่โหลดไฟล์ cubemap bmp และพยายามใช้โค้ดด้านล่างเพื่อแสดงผลเป็น cubemap
คุณสามารถเห็นด้านล่างว่าฉันยังแนบพื้นผิวอีกครั้งกับ GL_TEXTURE1 นี่คือเมื่อฉันตั้งเครื่องแบบ:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
มันสามารถเข้าถึงได้ในส่วน Shader uniform samplerCube Cubemap
ของฉันผ่านทาง
ฉันกำลังเรียกใช้ฟังก์ชันด้านล่างดังนี้:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
ตอนนี้ฉันรู้แล้วในลูปการวาดด้านล่างว่าฉันไม่ได้เปลี่ยนทิศทางมุมมองเพื่อดูแกน + x, -x, + y, -y, + z, -z ฉันแค่อยากเห็นบางสิ่งบางอย่างที่ทำงานก่อนที่จะดำเนินการนั้น ฉันคิดว่าอย่างน้อยฉันควรเห็นบางสิ่งบางอย่างบนวัตถุของฉันอย่างที่เป็นตอนนี้
ฉันไม่เห็นอะไรเลยดำดิ่งเลย ฉันทำให้พื้นหลังเป็นสีขาววัตถุก็ยังเป็นสีดำ ฉันลบแสงและระบายสีเพื่อลองชิมพื้นผิว cubemap แล้วยังเป็นสีดำ
ฉันคิดว่าปัญหาอาจเป็นรูปแบบประเภทเมื่อตั้งค่าพื้นผิวของฉันซึ่งก็คือ GL_RGB8, GL_RGBA แต่ฉันก็ลองด้วย:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
ฉันคิดว่านี่จะเป็นมาตรฐานเนื่องจากเราแสดงผลพื้นผิวที่แนบมากับ framebuffer แต่ฉันเห็นตัวอย่างที่แตกต่างกันซึ่งใช้ค่า enum ที่แตกต่างกัน
ฉันยังได้ลองเชื่อมแผนที่พื้นผิวของคิวบ์ในทุกการโทรที่ฉันต้องการใช้แผนที่ลูกบาศก์:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
นอกจากนี้ฉันไม่ได้สร้างบัฟเฟอร์ความลึกสำหรับ FBO ที่ฉันเห็นในตัวอย่างส่วนใหญ่เพราะฉันเพียงต้องการบัฟเฟอร์สีสำหรับแผนที่ลูกบาศก์ของฉัน ฉันจริงเพิ่มหนึ่งเพื่อดูว่าเป็นปัญหาและยังได้ผลลัพธ์เดียวกัน ฉันสามารถที่จะเหลวไหลขึ้นเมื่อฉันพยายาม
ความช่วยเหลือใด ๆ ที่สามารถชี้ให้ฉันในทิศทางที่ถูกต้องจะได้รับการชื่นชม
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
ฟังก์ชั่นของคุณดึงดูดสิ่งที่มองเห็นได้จริงหรือไม่? ฟังก์ชั่นนี้วาดบางสิ่งบางอย่างจริงเหรอ? จะเกิดอะไรขึ้นถ้าคุณเปลี่ยนdrawSpheres
เป็นแค่เคลียร์เฟรมเฟรม?