Фреймбуфер не захватывает все текстуры и не может быть обновлен.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Фреймбуфер не захватывает все текстуры и не может быть обновлен.

Сообщение Anonymous »

В настоящее время я борюсь с фреймбуфером в своей 2D-игре C++/OpenGL и не вижу своих проблем. Он не сохраняет некоторые из моих текстур и не может быть правильно обновлен, и я не могу найти причину.
Чтобы облегчить выбор текстур, я изображаю все свои текстуры в виде текстуру кадрового буфера и сохраняем там идентификатор и значения цвета каждой текстуры. Поэтому я создал этот класс фреймбуфера:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Текстура OpenGL показывает сплошной цвет текстуры, а не всей текстуры.
    Anonymous » » в форуме C++
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Почему мое видео не соответствует размеру текстуры, когда я меняю размер текстуры
    Anonymous » » в форуме Android
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Ошибка при попытке создать фреймбуфер для кубической карты для затенения в webgl
    Гость » » в форуме Javascript
    0 Ответы
    51 Просмотры
    Последнее сообщение Гость
  • Нежелательный курсор с рисованием Java2D непосредственно во фреймбуфер
    Anonymous » » в форуме JAVA
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • OpenGL: рендеринг фреймбуфера во фреймбуфер
    Anonymous » » в форуме C++
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»