Наклейка / Наклейка в OpenGL: рисовать текстуру без растяжки из CLAMP_TO_EDGE? - PullRequest
1 голос
/ 09 апреля 2011

В основном пытаюсь сделать наклейку на самолете. Изображение текстуры отображается на плоскости (может двигаться), но я не хочу растягивать изображение до края или повторять его. Как я могу просто иметь изображение на стене, как наклейку? Я использую шейдеры, не знаю, где я решу проблему. Представьте, что шахматная доска - это мое изображение, вот что происходит:

http://i.stack.imgur.com/bBDM0.gif

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

Вы можете включить проверку дальности в свой шейдер. Установка Параметр Clamp_to_edge влияет на то, какие пиксели вы получаете только после выборки, поэтому координаты текстуры, поступающие в ваш шейдер, будут по-прежнему выходить за пределы диапазона от нуля до единицы, когда вы находитесь в области, где вы не хотите выводить какие-либо пиксели. На оборудовании, обычно используемом сегодня для GL ES, быстрее передать цвет с альфа-значением 0, чем отбрасывать, так что делайте это, если ваш режим смешивания позволяет это.

например. Предположим, у вас есть только самый простой текстурный фрагментный шейдер:

void main()
{
    gl_FragColor = texture2D(tex2D, texCoordVarying);
}

Вместо этого вы можете использовать:

void main()
{
    if(clamp(texCoordVarying, vec2(0.0, 0.0), vec2(1.0, 1.0)) == texCoordVarying)
        gl_FragColor = texture2D(tex2D, texCoordVarying);
    else
        gl_FragColor = vec4(0.0); // or discard, if you need to
}

Однако явная проверка диапазона добавит стоимость обработки. Очевидно, беспокоиться об этом, только если это становится проблемой, но решение в этом случае просто добавить границу внутри вашей текстуры. Поэтому, если ваша текстура имеет размер 256x256, вы бы использовали центральные 254x254 пикселя и поместили бы полностью прозрачную рамку вокруг внешней стороны.

РЕДАКТИРОВАТЬ: более четко мыслить, если приемлема альфа-версия, а не отбрасывание, тогда можно использовать функцию шага для устранения условного выражения. Сделайте это четыре раза - один раз для каждого предела на каждой оси, инвертируйте результаты там, где вы хотите больше, чем тест, а не меньше, затем умножьте выходной альфа на все четыре результата. Если любой из них равен нулю, выходной альфа будет равен нулю.

0 голосов
/ 10 апреля 2011

Используйте взамен CLAMP_TO_BORDER и не забудьте установить цвет границы.

...