Tôi đang cố gắng tìm ra cách hiển thị cảnh của mình thành bản đồ khối. Tôi đã bị mắc kẹt trong điều này một chút và hình dung tôi sẽ nhờ các bạn giúp đỡ. Tôi mới sử dụng OpenGL và đây là lần đầu tiên tôi sử dụng FBO.
Tôi hiện có một ví dụ hoạt động về việc sử dụng tệp bmp cubemap và loại mẫu samplerCube trong shader mảnh được đính kèm với GL_TEXTURE1. Tôi hoàn toàn không thay đổi mã shader. Tôi chỉ thay đổi thực tế là tôi sẽ không gọi hàm đang tải tệp bmp cubemap và cố gắng sử dụng mã dưới đây để kết xuất thành sơ đồ khối.
Bạn có thể thấy bên dưới tôi cũng đang đính kèm kết cấu lại vào GL_TEXTURE1. Điều này là như vậy khi tôi đặt đồng phục:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
nó có thể truy cập nó trong shader mảnh của tôi thông qua uniform samplerCube Cubemap
.
Tôi đang gọi chức năng dưới đây như vậy:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Bây giờ, tôi nhận ra trong vòng vẽ bên dưới rằng tôi không thay đổi hướng xem để nhìn xuống trục + x, -x, + y, -y, + z, -z. Tôi thực sự chỉ muốn thấy một cái gì đó hoạt động trước khi thực hiện điều đó. Tôi hình dung ít nhất tôi nên nhìn thấy một cái gì đó trên đối tượng của mình theo cách mã hiện tại.
Tôi không thấy gì cả, chỉ là màu đen. Tôi đã làm cho nền của tôi màu trắng vẫn là đối tượng màu đen. Tôi đã loại bỏ ánh sáng và tô màu để chỉ lấy mẫu kết cấu hình khối và vẫn màu đen.
Tôi nghĩ vấn đề có thể là các loại định dạng khi đặt kết cấu của tôi là GL_RGB8, GL_RGBA nhưng tôi cũng đã thử:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Tôi nghĩ rằng đây sẽ là tiêu chuẩn vì chúng tôi đang kết xuất thành một kết cấu được gắn vào bộ đệm khung, nhưng tôi đã thấy các ví dụ khác nhau sử dụng các giá trị enum khác nhau.
Tôi cũng đã thử ràng buộc kết cấu bản đồ khối trong mỗi cuộc gọi vẽ mà tôi muốn sử dụng bản đồ khối:
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
Ngoài ra, tôi không tạo bộ đệm độ sâu cho FBO mà tôi thấy trong hầu hết các ví dụ, vì tôi chỉ muốn bộ đệm màu cho bản đồ khối của mình. Tôi thực sự đã thêm một để xem nếu đó là vấn đề và vẫn nhận được kết quả tương tự. Tôi có thể làm mờ nó lên khi tôi cố gắng.
Bất kỳ trợ giúp có thể chỉ cho tôi đi đúng hướng sẽ được đánh giá cao.
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
chức năng của bạn thực sự vẽ một cái gì đó có thể nhìn thấy? Liệu các chức năng thực sự vẽ một cái gì đó? Điều gì xảy ra nếu bạn thay đổidrawSpheres
để chỉ xóa bộ đệm khung?