Объекты, которые находятся вне сцены / области просмотра (OpenGL)

Пожалуйста, помогите мне понять, что такое хороший способ рисовать 2D сцену (орто). Я использую OpenGL с шейдерами.

Если у меня есть окно просмотра размером 800×600, например, и рисовать четырехугольники. Некоторые квады находятся в окне просмотра, а некоторые нет.

Квадраты, которые находятся вне области просмотра, обрабатываются OpenGL и шейдерами?
Если да, нужно ли вырезать их из функции рисования?
Есть ли стандартные решения (glEnable(???)) для этой ситуации или мне нужно сделать самому?

Рисовать:

void Draw()
{
glUseProgram(ProgramId);
glUniformMatrix4fv(MVPId, 1, GL_FALSE, (float*)pMVP);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, BaseQuadBufferId);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, BaseColorBufferId);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, OffsetQuadBufferId);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0);

glVertexAttribDivisor(0, 0); //basic size
glVertexAttribDivisor(1, 0); //basic color
glVertexAttribDivisor(2, 1); //offset
glDrawArraysInstanced(GL_QUADS, 0, 4, QuadCount);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
}

MVP:

CameraPosition = glm::vec3(0,0,1);
CameraDirection = glm::vec3(0,0,0);
Projection = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, -1.0f, 1.0f);
Model = glm::mat4(1.0f);
View = glm::lookAt(CameraPosition, CameraDirection, glm::vec3(0,1,0));
MVP = Projection * View * Model;

Вершинный шейдер:

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec4 vertexColor;
layout(location = 2) in vec2 vertexOffset;

uniform mat4 MVP;
out vec4 Color;

void main()
{
gl_Position =  MVP * vec4(vertexPosition + vec3(vertexOffset.xy,0), 1);
Color = vertexColor;
}

Изображение с вопросом:
http://imgur.com/VckmghQ

1

Решение

Все вершины, переданные с использованием glDraw…, обрабатываются вершинным шейдером (и геометрическими и / или тесселяционными шейдерами, если используются геометрические и / или тесселяционные шейдеры). Только после этапа обработки вершин (вершинный, тесселяционный и геометрический шейдеры) можно применить отсечение. После отсечения только те фрагменты, которые попадают в окно просмотра & прямоугольник ножниц и прохождение теста владения пикселем обрабатываются.

1

Другие решения

Когда ваш вопрос таков: должен ли я сам обрабатывать объекты за пределами видимой области, тогда ответ — нет.

OpenGL автоматически обрезает все примитивы и гарантирует, что все они отображаются правильно, даже если они частично видны. Технически это делается непосредственно перед вызовом фрагментного шейдера. Причина этого заключается в том, что предыдущие этапы шейдера могли преобразовать примитив, поэтому решение может быть принято только после всех них. Отсечение затем выполняется в нормализованных координатах устройства (и, следовательно, в 3D, также относительно ближней и дальней плоскости).

Посмотри на этот для получения дополнительной информации о конвейере рендеринга.

1

По вопросам рекламы [email protected]