2016-12-22 18 views
1

Я делаю симуляцию погоды в 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, чтобы все остальные объекты работали нормально. Как?

+1

Попробуйте установить координаты 'z' в массиве вершин на' 0'. Это '1' находится точно на плоскости отсечения, и это может быть проблемой. Кроме того, если у вас включена функция отбрасывания лица, убедитесь, что ваши плоские точки находятся в порядке против часовой стрелки. (также может захотеть отключить запись буфера глубины для этого и нарисовать его * first *!). –

+0

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

+0

@NicolBolas У меня уже есть идея, как удалить это «если» полностью, но условие позволяет легко отслеживать, пока я не смогу заставить его работать. – Gweddry

ответ

1

Проблема заключалась в том, чтобы поставить 1 в качестве координаты z - вместо этого вместо 0.999f была решена проблема.

+0

Возможно, вы также можете установить глубинный тест на 'gl.LEQUAL' или отключить тестирование глубины. Поскольку по умолчанию используется 'gl.LESS', и обычно вы очищаете глубину до 1,0, тогда установка Z на 1.0 означает, что ваш квад не меньше, и поэтому не прошел тест. Кроме того, вы можете создать простой skybox, [рисуя квадрат и используя cubemap] (http://twgljs.org/examples/no-box-skybox.html). – gman

 Смежные вопросы

  • Нет связанных вопросов^_^