Вложенные ножничные ящики с OpenGL - PullRequest
2 голосов
/ 19 сентября 2011

Я работаю над интерфейсом на основе OpenGL, написанным на C. У меня есть иерархия элементов управления - небольшие квадратные 2D-блоки внутри прокручиваемой области большего элемента управления.Внутри маленьких коробочек нарисованы 3D сцены.3D-сцену нужно прорезать в маленьких двухмерных прямоугольниках, а маленькие двухмерные прямоугольники следует обрезать в пределах большей области.

glScissor() является очевидным кандидатом на то, чтобы рисование занимало место в требуемой области.Проблема в том, что я не могу одновременно вызвать glScissor() для большой области, а затем снова вызвать glScissor() для субрегионов внутри большей ножничной области.

Пример кода для демонстрации того, что я хочу:

void drawBigBox() {
    glScissor( ... ); //set the bounds of the larger region
    for each little box {
        //these might be anywhere, but they should only be visible if inside the glScissor bounds
        drawLittleBoxes(); 
    }
}

void drawLittleBoxes() {
    //draw only inside little box -- Whoops! This replaces the big box bounds!
    //How can I meet this constraint while retaining the outer scissor region?
    glScissor( ... );
    draw3dScene();
}

Есть ли простой способ делать то, что я хочу?Очевидно, что я также могу рассчитать пересечение маленьких и больших ножничных ящиков, или я мог бы более тщательно обрезать / спроецировать мою 3D-сцену, но это сложнее, чем вызов OpenGL.Возможно, есть другой подход к этому, о котором я не знаю.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Для этого, вероятно, проще использовать трафаретный буфер.Вы можете использовать INCR для увеличения значений буфера трафарета при записи в него квадратора, а при рисовании вы устанавливаете тест на EQUAL или GEQUAL, чтобы записывать только там, где буфер трафарета имеет наибольшее значение, таким образом, он будет писать только в области, ограниченнойвсе текущие регионы отсечения.Чтобы удалить их при рисовании иерархии, используйте DECR, чтобы удалить их снова.Таким образом, вы также можете иметь непрямоугольные области отсечения.

4 голосов
/ 19 сентября 2011

Вы можете попытаться положиться на вызовы glPush / PopAttribs для сохранения и восстановления состояния ножниц.Однако это было удалено в 3.1, и стек для атрибутов может быть не таким большим, как вам нужно.Поэтому вы должны использовать явный стек.

Просто создайте какой-нибудь объект, который вы используете для установки текущего состояния ножниц.Каждый слой по мере того, как вы опускаетесь в стек вызовов, сдвигает свое состояние ножниц, которое использует фактический стек прямоугольников ножниц.У меня есть обобщенная версия этого, которая также выдвигает матрицы преобразования, параметры смешивания и т. Д.

Объект должен быть либо в состоянии глобального графического интерфейса, либо в комплекте с некоторым объектом, который вы передаете каждой из функций.

2 голосов
/ 19 сентября 2011

Вы можете получить координаты текущего блока ножниц (либо сохранить их, либо рассчитать их пересечение с другим регионом), используя glGet() с параметром GL_SCISSOR_BOX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...