Чтобы облегчить выбор текстур, я изображаю все свои текстуры в виде текстуру кадрового буфера и сохраняем там идентификатор и значения цвета каждой текстуры. Поэтому я создал этот класс фреймбуфера:
Код: Выделить всё
void Framebuffer::Awake()
{
glm::vec2 windowSize = GlobalHelper::GetCurrentWindowSize();
glm::vec4 viewportSize = GlobalHelper::GetViewportSize();
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
// color buffer
glCreateTextures(GL_TEXTURE_2D, 1, &colorAttachment);
glBindTexture(GL_TEXTURE_2D, colorAttachment);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, viewportSize.z, viewportSize.w, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0);
//ID buffer
glCreateTextures(GL_TEXTURE_2D, 1, &IDAttachment);
glBindTexture(GL_TEXTURE_2D, IDAttachment);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, viewportSize.x, viewportSize.y, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, IDAttachment, 0);
GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void Framebuffer::Bind()
{
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glClearTexImage(IDAttachment, 0, GL_RED_INTEGER, GL_INT, &defaultValue);
}
void Framebuffer::Unbind()
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
Код: Выделить всё
colorBuffer = Framebuffer();
colorBuffer.Awake();
while(!glfwWindowShouldClose(window)) {
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
colorBuffer.Bind();
BatchRenderer::ResetStats();
BatchRenderer::BeginBatch();
GlobalHelper::GetCurrentScene()->OnlyGameUpdate();
BatchRenderer::EndBatch();
BatchRenderer::Flush();
GetTexturePerMouseClick(&startMenuScene);
colorBuffer.Unbind();
Код: Выделить всё
void Scene::OnlyGameUpdate()
{
for (const auto& x : sceneTextures)
{
BatchRenderer::DrawQuad({x.position.x, x.position.y, 0.0f}, 0.0f + x.rotation,
{x.scale * (float)x.imageWidth, x.scale * (float)x.imageHeight}, x.ID, x.color, 0.0f, x.ID);
}
}
- Если я пытаюсь создать другую текстуру, например, фоновая текстура, вне функции OnlyGameUpdate(), фреймбуфер не сохранит ее, и ее нельзя увидеть в текстуре фреймбуфера, но мне действительно нужно, чтобы она могла хранить фоновую текстуру. Если я загружаю изображение вне функции, а затем добавляю его в SceneTextures в классе сцены, оно работает нормально.
-
как только я изменю сцену или область просмотра и мне нужно будет очистить текстуры фреймбуфера с помощью:
...значения по умолчанию остаются неизменными навсегда и не могут быть заполнены заново.
Код: Выделить всё
glClearTexImage(IDAttachment, 0, GL_RED_INTEGER, GL_INT, &defaultValue); glClearTexImage(colorAttachment, 0, GL_RGBA, GL_FLOAT, &defaultColor);
Подробнее здесь: https://stackoverflow.com/questions/786 ... -refreshed