glGetActiveUniformName — это функция, которая может использоваться для запроса длины имени униформы GLSL в соответствии с документация. Это можно сделать, установив uniformName в NULL (0) и поставляя GLsizei указатель как переменная длина. При этом можно ожидать, что длина имени униформы будет возвращена в длина параметр, но эта переменная не изменяется после вызова функции, как описано выше. Появляется ошибка GL_INVALID_VALUE, которая, согласно документации, может означать одно из трех:
GL_INVALID_VALUE is generated if uniformIndex is greater than or equal to the value of GL_ACTIVE_UNIFORMS.
GL_INVALID_VALUE is generated if bufSize is negative.
GL_INVALID_VALUE is generated if program is not the name of a program object for which glLinkProgram has been issued.
В моем случае uniformIndex 0 и GL_ACTIVE_UNIFORMS сообщает 5. BUFSIZE специально установлено на 0 и поэтому не может быть отрицательным. Вызов glGetProgram с GL_LINK_STATUS для используемой программы возвращает GL_TRUE (1). Это исключает все 3 известные причины этой ошибки. Не было никаких предыдущих ошибок в соответствии с glGetError непосредственно перед вызовом glGetActiveUniformName и вызовом его с допустимым BUFSIZE а также uniformName оба успешно без ошибок и записывают в буфер в uniformName как и ожидалось; правильно писать имя униформы.
Помимо того, что не сообщается о длине названия униформы и, наоборот, есть ошибки, есть и другие тревожные признаки; если BUFSIZE устанавливается на положительное значение больше нуля и uniformName имеет значение NULL (0), в который записывается функция uniformName в любом случае, потенциально может привести к серьезному повреждению памяти. Это поведение не соответствует спецификации, которая гласит, что следует uniformName быть NULL (0), тогда ничего не должно быть записано в него.
Собрав всю вышеприведенную информацию, я думаю, что могу с уверенностью заключить, что в моем коде нет ошибок, но вместо этого есть ошибка где-то за пределами моего собственного кода, именно поэтому я публикую здесь. Есть ли кто-нибудь, кто может проверить поведение этой функции при использовании, как описано выше?
Я думаю, что это может быть проблема с драйверами, что означает, что только люди, использующие драйверы и оборудование nVidia, увидят проблему, но пока рано исключать какую-либо группу пользователей.
P.S .: Это произошло на машине с последними драйверами (обновленными специально для проверки вышеуказанных операторов) с установленной nVidia GeForce 660 GTX. Машина Dell XPS 8500 работает под управлением 64-битной Windows 7 Professional SP1. Программа была построена с использованием Visual Studio 2012 Professional, полностью обновлена. Этот пост был также размещен на форумах разработчиков nVidia и DevMaster, размещенных здесь для лучшего ознакомления и в надежде решить проблему быстрее.
ОБНОВЛЕНИЕ 1: рассматриваемый код был протестирован на другой машине с другим графическим процессором (nVidia GeForce 9600M GT), снова с последними драйверами и показал идентичные результаты. Эта машина работает под управлением 64-разрядной Windows 7 Ultimate SP1. Снова бинарный файл был собран с VS2012.
Кажется, документация здесь не так. Спецификация OpenGL здесь очень понятна: length
для количества символов, которые фактически записаны в буфер. Кроме того, спецификация не требует каких-либо пустых проверок для uniformName
параметр.
Или, другими словами, вы не можете использовать glGetActiveUniformName
чтобы получить длина от имени униформы. Вы должны сделать это с glGetActiveUniform
,
Я исправил документация в вики.
Других решений пока нет …