OpenGL-ES: возможно ли использовать целочисленную поверхность в качестве цветовой привязки? - PullRequest
1 голос
/ 24 апреля 2020

Я пишу игру для Android устройств, использующих Android NDK и OpenGL-ES . Я рендерил изображение в кадровый буфер и затем использую эту информацию в ЦП. Большая точность была бы лучше, поэтому я использовал:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, width, height, 0, GL_RGBA_INTEGER,
                 GL_UNSIGNED_INT, nullptr);

, чтобы создать поверхность для (только) цветового вложения. Я выбрал его, потому что это был единственный 32-битный тип поверхности цвета, который можно было использовать в качестве цветового вложения, указанного на странице OpenGL-ES для glTexImage2D.

Это отлично работает на некоторых устройствах, но на Android 6 HT C phone, с телефона выводятся следующие ошибки:

E/Adreno-ES20: <core_glClear:62>: WARNING: glClear called on an integer buffer. Buffer contents will be undefined
    <oxili_check_sp_rb_fmt_mismatch:86>: WARNING : Rendertarget does not match shader output type.
E/Adreno-ES20: <core_glClear:62>: WARNING: glClear called on an integer buffer. Buffer contents will be undefined
E/Adreno-ES20: <oxili_check_sp_rb_fmt_mismatch:86>: WARNING : Rendertarget does not match shader output type.

Примечание. Эти сообщения находятся в файле журнала, ошибки gl не были возвращены с glGetError.

Я получаю эту ошибку только потому, что это старый телефон с ошибками, или есть проблема с тем, что я делаю?

Страница OpenGL-ES на glTexImage2D утверждает, что поверхность может использоваться в качестве цветового вложения:

Справочная страница Khronos glTexImage2D

Выходные данные от фрагментного шейдера являются средними vec4 (gl_FragColor), но их нельзя изменить, верно?

Примечание: результат, который я получаю из кода, это просто чистый цвет телефона с ошибкой в ​​файле журнала (и еще один телефон, который является более поздней моделью той же марки). Нет ошибок, возвращаемых из glGetError. И glCheckFramebufferStatus вернул, что кадровый буфер завершен.

Код для создания кадрового буфера:

glGenTextures(1, &m_depthMap);
checkGraphicsError();
glBindTexture(GL_TEXTURE_2D, m_depthMap);
checkGraphicsError();
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0,
             GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
checkGraphicsError();
glBindTexture(GL_TEXTURE_2D, 0);
checkGraphicsError();

glGenFramebuffers(1, &m_depthMapFBO);
checkGraphicsError();

glBindFramebuffer(GL_FRAMEBUFFER, m_depthMapFBO);
checkGraphicsError();

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthMap, 0);
checkGraphicsError();


glGenTextures(1, &m_colorImage);
checkGraphicsError();
glActiveTexture(activeTextureIndicator);
checkGraphicsError();
glBindTexture(GL_TEXTURE_2D, m_colorImage);
checkGraphicsError();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32UI, width, height, 0, GL_RGBA_INTEGER,
             GL_UNSIGNED_INT, nullptr);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
checkGraphicsError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
checkGraphicsError();
glBindTexture(GL_TEXTURE_2D, 0);
checkGraphicsError();

glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentIndicator, GL_TEXTURE_2D, m_colorImage, 0);
checkGraphicsError();

GLenum rc = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (rc != GL_FRAMEBUFFER_COMPLETE) {
    std::string c;
    switch (rc) {
        case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
            c = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
            c = "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
            break;
        case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
            c = "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS";
            break;
        case GL_FRAMEBUFFER_UNSUPPORTED:
            c = "GL_FRAMEBUFFER_UNSUPPORTED";
            break;
        default:
            c = "Unknown return code.";
    }
    throw std::runtime_error(std::string("Framebuffer is not complete, returned: ") + c);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
checkGraphicsError();
...