Я делаю симуляцию погоды в Opengl 4.0 и пытаюсь создать небо, создав полноэкранный квадрант в фоновом режиме. Я пытаюсь сделать это, если шейдер вершин генерирует четыре вершины, а затем рисует треугольную полоску. Все прекрасно компилируется, и я вижу все другие объекты, которые я делал раньше, но небо нигде не видно. Что я делаю не так?Переключение с 3D на 2D в OpenGL
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, чтобы все остальные объекты работали нормально. Как?
Попробуйте установить координаты 'z' в массиве вершин на' 0'. Это '1' находится точно на плоскости отсечения, и это может быть проблемой. Кроме того, если у вас включена функция отбрасывания лица, убедитесь, что ваши плоские точки находятся в порядке против часовой стрелки. (также может захотеть отключить запись буфера глубины для этого и нарисовать его * first *!). –
Если ваш шейдер делает две совершенно разные вещи, такие как на основе униформы, которая переключается один раз, то у вас действительно есть два шейдера. Убершадеры хороши и все, но нет никаких оснований идти на такие крайности для совершенно разных видов операций рендеринга. –
@NicolBolas У меня уже есть идея, как удалить это «если» полностью, но условие позволяет легко отслеживать, пока я не смогу заставить его работать. – Gweddry