Следующий код устанавливает тест трафарета, чтобы увидеть, ref
больше, чем хранимое значение в буфере трафарета, и если это так, он напишет ref
в буфер трафарета
unsigned int ref = 42;
glStencilFunc(GL_GREATER, ref, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
Проблема в том, что пока я хочу протестировать буфер трафарета ref
Я не хочу записывать ref
для этого, если это удастся, я хочу написать совершенно другое значение. Единственный вариант, который я нашел, это GL_INCR
который может занять место GL_REPLACE
, но это не очень полезно, если в буфере трафарета уже написано много материала, который не может быть очищен заранее.
Есть ли способ … скажем, проверить, чтобы увидеть, больше ли 42, чем то, что хранится в буфере трафарета, и если это так, записать в него 100 или что-то еще?
Я не верю, что эта функциональность доступна в стандартном OpenGL. Самое близкое, что я нашел, это расширение для конкретного поставщика: AMD_stencil_operation_extended.
Это поддерживает именно то, что вы ищете:
Кроме того, это расширение отделяет значение, используемое в качестве источника для операций с трафаретом, от эталонного значения, что позволяет использовать различные значения в тесте трафарета и при обновлении буфера трафарета.
Просто после прочтения спецификации звонки должны выглядеть примерно так: val
значение шаблона, которое вы хотите установить:
glStencilFunc(GL_GREATER, ref, 0xFF);
glStencilOpValueAMD(GL_FRONT_AND_BACK, val);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE_VALUE_AMD);