Я намагаюся розібратися, як відобразити свою сцену на карту кубів. Я трохи застряг у цьому і подумав, що попрошу вас, допомогти. Я новачок у OpenGL, і це перший раз, коли я використовую FBO.
На даний момент у мене є робочий приклад використання файлу bmp кубічної карти, а тип вибірки samplerCube у шейдері фрагмента додається до GL_TEXTURE1. Я взагалі не змінюю код шейдера. Я просто змінюю той факт, що я не буду викликати функцію, яка завантажувала файл bema cubemap і намагалася використовувати код нижче, щоб передати кубічну карту.
Нижче ви бачите, що я також знову додаю текстуру до GL_TEXTURE1. Це так, коли я встановлюю форму:
glUniform1i(getUniLoc(myProg, "Cubemap"), 1);
він може отримати доступ до нього в моєму фрагменті шейдера через uniform samplerCube Cubemap
.
Я називаю нижченаведену функцію так:
cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE);
Тепер я розумію в циклі малювання нижче, що я не змінюю напрямок перегляду, щоб дивитися вниз по осі + x, -x, + y, -y, + z, -z. Я справді просто хотів побачити щось, що працює, перш ніж це здійснити. Я подумав, що я повинен хоч щось побачити на своєму об’єкті так, як зараз код.
Я нічого не бачу, просто прямо чорний. Я зробив свій фон білим досі об'єкт чорним. Я зняв освітлення та фарбування, щоб просто пробувати текстуру кубічної карти та все ще чорну.
Я думаю, що проблемою можуть бути типи формату при встановленні моєї текстури, яка є GL_RGB8, GL_RGBA, але я також спробував:
GL_RGBA, GL_RGBA GL_RGB, GL_RGB
Я думав, що це буде стандартом, оскільки ми рендеруємо на текстуру, прикріплену до фреймбуфера, але я бачив різні приклади, що використовують різні значення перерахунків.
Я також намагався прив’язати текстуру карти куба в кожному розіграші, що я хочу використовувати карту куба:
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
просто очистити фреймбуфер?