Ответ 1
Не совсем понятно, что вы подразумеваете под "GL_TEXTURE_2D is active" или "GL_TEXTURE_2D установлен".
Обратите внимание на следующее:
-
glEnable(GL_TEXTURE_2D)
не влияет на ваш (фрагмент) шейдер. Он параметризует часть фиксированной функции вашего конвейера, которую вы только что заменили, используя фрагментарный шейдер. - Внутри шейдера GLSL нет "прямого" / "чистого" способа, существует ли достоверная текстура, связанная с блоком текстур, связанным с вашим сэмплером текстур (насколько мне известно).
- Начиная с GLSL 1.3 вам может понадобиться использовать
textureSize(sampler, 0).x > 0
для обнаружения наличия допустимой текстуры, связанной с семплером, но это может привести к поведению undefined. - Расширение ARB_texture_query_levels действительно явно указывает, что
textureQueryLevels(gsampler2D sampler)
возвращает 0, если нет текстуры, связанной с семплером.
Должен ли ты пойти другим путем? Я так думаю: вместо того, чтобы принимать решение внутри шейдера, просто привяжите текстуру 1x1 пикселя "белый" и безоговорочно попробуйте эту текстуру и умножьте результат на цвет, который, очевидно, вернет 1.0 * color
. Это будет более портативным и быстрым.