Переключение с 3D на 2D в OpenGL

Я делаю симуляцию погоды в Opengl 4.0 и пытаюсь создать небо, создав полноэкранный четырехугольник на заднем плане. Я пытаюсь сделать это, заставляя вершинный шейдер генерировать четыре вершины, а затем рисуя треугольную полосу. Все компилируется просто отлично, и я вижу все другие объекты, которые я сделал раньше, но неба нигде не видно. Что я делаю не так?

main.cpp

GLint stage = glGetUniformLocation(myShader.Program, "stage");
//...
glBindVertexArray(FS); //has four coordinates (-1,-1,1) to (1,1,1) in buffer object
glUniform1i(stage, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);

вершинный шейдер

uniform int stage;
void main()
{
    if (stage==1)
    {
        gl_Position = vec4(position, 1.0f);
    }
    else
    {
        //...
    }    
}

фрагментный шейдер

uniform int stage;
void main()
{
    if (stage==1)
    { //placeholder gray colour so I can see the sky
        color = vec4(0.5f, 0.5f, 0.5f, 1.0f);
    }
    else
    {
        //...
    }
}

Я также должен упомянуть, что я новичок в OpenGL и что он действительно должен быть в OpenGL 4.0 или более поздней версии.

EDIT: я понял, в чем проблема, но до сих пор не знаю, как ее исправить. Квадрат существует, но отображается только в том случае, если я умножаю его на матрицу вида и проекции (но тогда он не остается приклеенным к экрану, а просто вращается вместе с остальной частью сцены, чего я не хочу). По сути, мне как-то нужно переключиться обратно в 2D или в экранное пространство или как там это называется, нарисовать квадрат и снова переключиться в 3D, чтобы все остальные объекты работали нормально. Как?


person Gweddry    schedule 22.12.2016    source источник
comment
Попробуйте установить координаты z в массиве вершин на 0. Этот 1 находится точно на дальней плоскости отсечения и может быть проблемой. Кроме того, если у вас включено отсечение лиц, убедитесь, что точки плоскости расположены против часовой стрелки. (также может потребоваться отключить для этого запись в буфер глубины и отрисовать его сначала!).   -  person Tim Čas    schedule 23.12.2016
comment
Если ваш шейдер делает две совершенно разные вещи, основанные на униформе, которая переключается один раз, то на самом деле у вас есть два шейдера. Убершейдеры хороши и все такое, но нет причин впадать в такие крайности для совершенно разных видов операций рендеринга.   -  person Nicol Bolas    schedule 23.12.2016
comment
@NicolBolas У меня уже есть идея, как полностью удалить это «если», но условие позволяет легко отслеживать его, пока мне не удастся заставить его работать.   -  person Gweddry    schedule 23.12.2016
comment
@TimČas Это сработало! Я установил плоскость z на 0,9999f, и теперь квадрат виден и приклеен к экрану, а объекты обрезаются, только если я сильно увеличу масштаб — было бы лучше, если бы они никогда этого не делали (еще один совет?), но теперь это должно быть хорошо для всех практических целей. Это мой первый раз на SO; как дать тебе баллы?   -  person Gweddry    schedule 23.12.2016
comment
@Gweddry: Можешь нарисовать небо перед остальной сценой? Если вы можете, вы можете просто отключить запись глубины (и, возможно, тесты, если вы еще не очистили буфер глубины), а затем нарисовать небо на глубине 0, как в (+/- 1, +/- 1, 0). И вы можете дать очки, нажав на маленький треугольник, который появляется слева от комментария, если вы наведете на него курсор (хотя не уверен, что для этого есть минимальный предел репутации) --- но не беспокойтесь об этом.   -  person Tim Čas    schedule 25.12.2016


Ответы (1)


Проблема была с установкой 1 в качестве координаты z — установка 0,999f вместо этого решила проблему.

person Gweddry    schedule 23.12.2016
comment
Вероятно, вы также могли бы установить для проверки глубины значение gl.LEQUAL или отключить проверку глубины. Поскольку значение по умолчанию — gl.LESS, и обычно вы очищаете глубину до 1,0, то установка Z на 1,0 означает, что ваш квадроцикл был не меньше и поэтому не прошел тест. Кроме того, вы можете создать простой скайбокс, нарисовав четырехугольник и используя кубическую карту. . - person gman; 18.05.2017