Карта куба не работает с optirun в Ubuntu

Я не могу понять, почему этот код работает, пока я не использую Optirun

//Initialize GLUT and OpenGL
void ViewPort::startVideo(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(XWIN, YWIN);
glutCreateWindow("Titolo");
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_CUBE_MAP);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

//OpenGL INFO
printf("GL_VERSION:   %s\n", glGetString(GL_VERSION));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_VENDOR:  %s\n", glGetString(GL_VENDOR));
shadow = new ShadowMap(256 * SHADOW_QUALITY, 256 * SHADOW_QUALITY);
}

/*...*/

ShadowMap::ShadowMap(int w, int h) {
this->h = h;
this->w = w;

shadowShader = new Shader("./basicShader.vs", "./shadowShader.fs");

// Create the cube map
glGenTextures(1, &shadowCubeID);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowCubeID);

if (int err = glGetError())
    cerr << "glDebug: " << gluErrorString(err) << " shadow map" << endl;

for (unsigned int i = 0; i < 6; i++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT, w, w, 0,
    GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    if (int err = glGetError())
        cerr << "glDebug: " << gluErrorString(err) << " shadow map" << endl;
}

//now i render to the shadowFBO
glGenFramebuffers(1, &shadowFBO);
glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);

//disable read and write from color buffer
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,     GL_TEXTURE_CUBE_MAP_POSITIVE_X,
        shadowCubeID, 0);

errorCheckFBO();

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
}

Ошибка (недопустимая операция) - когда я создаю каждую из шести граней карты куба с помощью glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,...) Единственное, что я могу себе представить, это некоторая несовместимость с версией OpenGL.

Информация OpenGL печатается, когда программа работает:

GL_VERSION:   3.0 Mesa 10.1.3
GL_RENDERER: Mesa DRI Intel(R) Haswell Mobile 
GL_VENDOR:  Intel Open Source Technology Center

Когда это не работает:

GL_VERSION:   2.1 Mesa 10.1.3
GL_RENDERER: Gallium 0.4 on llvmpipe (LLVM 3.4, 256 bits)
GL_VENDOR:  VMware, Inc.

Как мне обойти проблему? (Извините за мой английский)


person Zefiro    schedule 06.08.2014    source источник


Ответы (1)


Текстуры глубины карты куба не поддерживаются в OpenGL 2.1. Из спецификации:

Текстуры с базовым внутренним форматом DEPTH_COMPONENT поддерживаются командами спецификации изображения текстуры, только если целью является TEXTURE_1D, TEXTURE_2D, PROXY_TEXTURE_1D или PROXY_TEXTURE_2D. Использование этого формата в сочетании с любой другой целью приведет к ошибке INVALID_OPERATION.

Соответствующий абзац в спецификации 3.0 меняется на:

Текстуры с базовым внутренним форматом глубины_компонента или Dyze_stencil поддерживаются только командами спецификации текстурного изображения, только в том случае, если Target IS Texture_1d, Texture_2d, Texture_1d_array, Texture_2D_ARRAY, TEXTURE_CUBE_MAP, proxy_texture_1d, proxy_texture_2d, proxe_texture_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_1ray_. Использование этих форматов в сочетании с любой другой целью приведет к ошибке INVALID_OPERATION.

Исходя из этого, текстуры глубины карты куба являются функцией OpenGL 3.0 и выше.

person Reto Koradi    schedule 06.08.2014