Чем GL_CLAMP в OpenGL отличается от GL_CLAMP_TO_EDGE? - PullRequest
0 голосов
/ 30 июня 2019

В зависимости от того, на какую документацию вы ссылаетесь glTexParameteri(), закрепление текстур имеет 2 различные интерпретации.
В документации Microsoft вы найдете GL_CLAMP , а в документации Хроноса вы найдете GL_CLAMP_TO_EDGE .

Я думал, что они синонимичны по функциям, но это не так.
На моем Ubuntu 18.04.2 у меня есть следующее.

/usr/include/GL/gl.h
#define GL_CLAMP_TO_EDGE                        0x812F
#define GL_CLAMP                                0x2900
#define GL_CLAMP_TO_BORDER                      0x812D

В то время как в моей сборке Windows 10 16299 Enterprise у меня есть следующее.

C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um\gl\GL.h
#define GL_CLAMP                          0x2900

Они отображаются на разные значения, поэтому можно ожидать и другого поведения.
Я пытаюсь избавиться от артефактов, которые мы получаем при использовании GL_REPEAT. См. Зеленые кружки на следующем изображении (источник изображения - freepik.com ).

Womain's face - freepik

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

Я пишу код на моей машине с Windows и позже могу портировать то же приложение на GNU / Linux.

Обновление 1 : GL_CLAMP избавить меня от большинства артефактов, но не от всех, в конце концов я добавил прозрачную рамку размером 10 пикселей для всех своих текстур. Вопрос все еще стоит однако.

Обновление 2 : Вопрос не в том, как GL_CLAMP отличается между реализациями, а в чем GL_CLAMP отличается от GL_CLAMP_TO_EDGE?

1 Ответ

1 голос
/ 01 июля 2019

Если вы покопаетесь в Khronos Registry различных спецификациях GL, вы найдете некоторые объяснения.

В самой первой спецификации (1.0 1994) CLAMP и REPEAT былитолько опции для TEXTURE_WRAP_x параметров.

Spec 1.2 1998 добавлено CLAMP_TO_EDGE.Он дает подсказку, которая вам нужна:

GL обычно зажимает так, что координаты текстуры ограничены точно диапазоном [0; 1].Когда координата текстуры фиксируется с использованием этого алгоритма, фильтр выборки текстуры перекрывает край изображения текстуры, беря половину значений выборки из изображения текстуры, а другую половину - от границы текстуры.Иногда желательно закрепить текстуру, не требуя границы и не используя постоянный цвет границы.

Новый алгоритм ограничения текстуры, CLAMP_TO_EDGE, ограничивает координаты текстуры на всех уровнях mipmap, так что фильтр текстуры никогда не производит выборкупограничный тексель.Цвет, возвращаемый при закреплении, получается только из текселей на краю текстурного изображения.


Параметр CLAMP устарел в спецификации 3.0 2008 и удален в спецификации 3.2 Core 2009. Вы все еще можете использовать его, если (и только если) вы не устанавливаете базовый профиль контекст.


Причина, по которой документация Microsoft относится к старым CLAMP, заключается в том, что MS предоставляетOpenGL 1.1 без необходимости извлечения указателей функций на команды GL.Более высокие версии требуют специальных заголовков (кроме gl.h) и других специальных вещей.

...