Я рендеринг на текстуру, но рендер-буфер черный

0

Я пытаюсь сделать текстуру. Использование opengl-es 2.0.Я хочу сделать черно-белую постпроцессинг. Но все, что я вижу, это черная текстура. На сцене у меня есть источники света и две сферы. Но когда я пытаюсь сделать моя текстура, прикрепленная к фреймбуферу, я вижу черный квадрат.

    this->frameBuffersCount = 3;
    this->frameBuffers = new int[frameBuffersCount];

    glGenFramebuffers(frameBuffersCount, (GLuint*)this->frameBuffers);

    this->texturesCount = this->frameBuffersCount * 2;
    this->bufferTextures = new int[this->texturesCount];

    glGenTextures(this->texturesCount, (GLuint*)this->bufferTextures);

    for(int i = 0; i < this->texturesCount / 2; ++i)
    {
        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[2*i]);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D,0);

        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[2*i + 1]);

        glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, screenWidth, screenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D,0);
    }

    for(int i = 0; i < this->frameBuffersCount; ++i)
    {
        glBindFramebuffer(GL_FRAMEBUFFER, this->frameBuffers[i]);

        glFramebufferTexture2D(GL_FRAMEBUFFER,
            GL_COLOR_ATTACHMENT0,
            GL_TEXTURE_2D,
            this->bufferTextures[2*i],
            0);

        glFramebufferTexture2D(GL_FRAMEBUFFER,
            GL_DEPTH_ATTACHMENT,
            GL_TEXTURE_2D,
            this->bufferTextures[2*i + 1],
            0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    }

    this->ordinaryQuad = new ModelVertex[4];

    this->ordinaryQuad[0].UV = Vector2(0.0,0.0);
    this->ordinaryQuad[0].position = Vector3(-1, -1, 0.0);

    this->ordinaryQuad[1].UV = Vector2(0.0,1.0);
    this->ordinaryQuad[1].position = Vector3(-1.0, 1.0, 0.0);

    this->ordinaryQuad[2].UV = Vector2(1.0,1.0);
    this->ordinaryQuad[2].position = Vector3(1.0, 1.0, 0.0);

    this->ordinaryQuad[3].UV = Vector2(1.0,0.0);
    this->ordinaryQuad[3].position = Vector3(1.0, -1.0, 0.0);

Это код рендеринга.

    void EffectManager::applyBnW()
{
    glBindFramebuffer(GL_FRAMEBUFFER, this->frameBuffers[0]);
    auto res = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(res == GL_FRAMEBUFFER_COMPLETE)
    {
        SceneManager::GetInstance().DrawScene();

        glDisable(GL_DEPTH_TEST);
        unsigned short indices[6] = {0,2,1,2,0,3};

        Shaders shaders;
        shaders.Init("../Resources/Shaders/BlackAndWhiteVS.vs", "../Resources/Shaders/BlackAndWhiteFS.fs", 0);
        glUseProgram(shaders.program);

        unsigned int hVBuff,hInBuff;

        glGenBuffers(1, &hVBuff);
        glGenBuffers(1, &hInBuff);

        glBindBuffer(GL_ARRAY_BUFFER, hVBuff);
        glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(SEngine::ModelVertex), this->ordinaryQuad, GL_STATIC_DRAW);
        //glBindBuffer(GL_ARRAY_BUFFER, 0);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, hInBuff);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned short), indices, GL_STATIC_DRAW);
        //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[0]);
        glGenerateMipmap(GL_TEXTURE_2D);

        if(shaders.positionAttribute != -1)
        {
            glEnableVertexAttribArray(shaders.positionAttribute);
            glVertexAttribPointer(shaders.positionAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(SEngine::ModelVertex), 0);
        }

        if(shaders.UVAttribute != -1)
        {
            glEnableVertexAttribArray(shaders.UVAttribute);
            glVertexAttribPointer(shaders.UVAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(SEngine::ModelVertex), (void*)(sizeof(Vector3)));
        }

        if(shaders.samplerUniform != -1)
        {
            glUniform1i(shaders.samplerUniform, 0);
        }

        glBindFramebuffer(GL_FRAMEBUFFER, 0);

        glDrawElements(GL_TRIANGLES, 6,  GL_UNSIGNED_SHORT, (void*)0);
        //glDrawArrays(GL_TRIANGLES,0,4);
    }

Что не так?

  • 2
    Слишком много кода, сделайте SSCCE.
  • 0
    Что такое SSCCE? Я не понимаю.
Показать ещё 4 комментария
Теги:
opengl-es
rendering
render
opengl-es-2.0

2 ответа

0
Лучший ответ

Solved.It были проблемы с индексным буфером, и я забыл отключить depth_test.

0

Непонятный ответ может быть дан, поскольку в вашем вопросе недостаточно информации/кода.

Вы очистили буфер глубины? Когда вы создали цвет в шейдере фрагментов для визуализированных объектов, правильно ли вы вычислили белый цвет?

Один из способов, который я делаю в этих ситуациях, чтобы помочь мне отладить проблему, - удалить потенциальные области ошибок.

Очистить фреймбуфер до красного цвета и альфа-канала = 1,0 Очистить буфер глубины Жесткий код gl_FragColor to vec4 (1,1,1,1)

Поступая таким образом, вы можете увидеть, все ли на выходе все красные? Тогда проблема связана с рендерингом объекта, таким как преобразование, отсечение, отклонение глубины или другая причина. Если вы можете увидеть объекты с белым цветом? Тогда вы знаете, что проблема с вашим шейдером фрагмента

Я также рекомендовал бы удалить строку glGenerateMipmap (GL_TEXTURE_2D); Как видно из кода, он не добавляет лишних. Если это не является основной причиной вашей ошибки. Генерирование mipmaps на текстуре, которая все еще используется и прикрепляется к объекту framebuffer, не очень эффективна, особенно если внутреннему внутреннему устройству придется перераспределять память для хранения новых уровней mipmap.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню