Текстуры скайбокса отображаются некорректно

У меня проблема с текстурами скайбоксов. Если повернуть камеру, создается ощущение, что одна текстура накладывается на другую, как на скриншоте:

пример

Шоу-код Skybox:

private void drawSkybox(int texId){

    glColor4f(1,1,1,1);
    glDepthMask(false);
    glEnable(GL_TEXTURE_CUBE_MAP);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_CUBE_MAP, texId);
    glBindVertexArray(vao[0]);
    glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindVertexArray(0);
    glBindBuffer (GL_ARRAY_BUFFER, 0);
    glDepthMask(true);
    glDisable(GL_TEXTURE_CUBE_MAP);
}

Мои параметры opengl:

glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable(GL_NORMALIZE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_SMOOTH);
glColorMask (true, true, true, true);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);

И мой вызов drawSkybox:

glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-max, max, -1, 1, 10, -10);
glRotated(cameraX, 1f, 0f, 0);
glRotated(cameraY, 0f, 1f, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
drawSkybox(texId);

Как я могу решить проблему?

Я понимаю, что проблема в glDepthMask(false);, но как ее заменить?

Если я просто удалю glDepthMask(false); и заменю его примером с glDepthFunc(GL_LEQUAL); и glDepthFunc(GL_LESS);, тогда скайбокс будет перекрывать все другие объекты, и только он будет виден -


person Aryesia    schedule 13.04.2020    source источник


Ответы (1)


Не меняйте маску глубины или тест глубины при рисовании скайбокса. Сохраните функцию проверки глубины GL_LESS.

private void drawSkybox(int texId){

    glColor4f(1,1,1,1);
    // glDepthMask(false); <---- DELETE

    // [...]
}

Но очистите буфер глубины снова после рисования скайбокса. Сначала нарисуйте скайбокс, затем скайбокс покроет весь экран. Затем очистите буфер глубины, таким образом, все объекты, которые будут отрисованы после, будут закрывать скайбокс:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// [...]

drawSkybox(texId);
glClear(GL_DEPTH_BUFFER_BIT);

// render other objects
// [...]
person Rabbid76    schedule 13.04.2020