Стереть части рисунков в OpenGL - PullRequest
3 голосов
/ 16 июня 2011

Хотелось бы узнать, возможно ли стереть части какого-либо чертежа в OpenGL?Допустим, я нарисовал две линии с помощью мыши, и эти линии перекрываются в некоторых точках.

Можно ли стереть только одну линию?Есть ли более или менее простой подход?

Ответы [ 5 ]

8 голосов
/ 16 июня 2011

OpenGL не хранит то, что вы рисуете.Если вы рисуете линию в OpenGL, то OpenGL возьмет эту линию, выполнит с ней различные математические операции и запишет пиксели в кадровый буфер, который принимает форму линии.OpenGL не помнит, что вы нарисовали линию;все, что может сделать OpenGL, - это записать пиксели в кадровый буфер.

Общая идея заключается в том, что пользователь OpenGL должен запомнить, что он нарисовал.Поэтому, если вы рисуете две линии, вы должны помнить координаты, которые вы дали для этих двух линий.Поэтому, если вы хотите «стереть» строку, вам нужно очистить экран и перерисовать все , кроме этой строки.

Это не так глупо, как может показаться.Многие приложения OpenGL постоянно перерисовывают экран.Они показывают кадр, рисуют новый кадр, затем показывают этот кадр и т. Д. Это дает возможность для анимации: изменение того, что рисуется и где оно рисуется от кадра к кадру.Это создает иллюзию движения.

0 голосов
/ 16 июня 2011

Вы можете попробовать методы буфера трафарета. См. Технику Дж. Кармака по теневым объемам (обратный трафарет или что-то в этом роде).

0 голосов
/ 16 июня 2011

Вы можете использовать glLogicOp с GL_XOR, а затем перекрасить строку, чтобы стереть ее.Это не общее решение.

0 голосов
/ 16 июня 2011

Вам нужно очистить буфер и перерисовать строки, которые вы хотите.Для этого вам, вероятно, нужно хранить данные строки в некоторой структуре.

0 голосов
/ 16 июня 2011

Есть два подхода, если я вас правильно понял.

  1. Перекрасьте только те элементы, которые вам нужны, каждый элемент должен иметь логическое значение, указывающее, будет ли он окрашен или нет.

  2. Если вам нужно стереть ровно одну часть окна, используйте glScissor.

Информация:

Теперь что-то новое. Замечательная команда GL под названием glScissor (x, y, w, h). Эта команда создает почти то, что вы бы назвали окном. Когда GL_SCISSOR_TEST включен, единственная часть экрана, которую вы можете изменить, это часть внутри окна ножниц.

...