У меня есть структура, определенная в моем GLSL следующим образом:
struct Rect {
float x;
float y;
float width;
float height;
};
, которую я хочу использовать как униформу:
uniform Rect TextureRect;
Так что в моем коде я создаюмассив Uniforms:
_hudTexUniform = new[]
{
new Uniform(_hudShader, "TextureRect.x"),
new Uniform(_hudShader, "TextureRect.y"),
new Uniform(_hudShader, "TextureRect.width"),
new Uniform(_hudShader, "TextureRect.height"),
};
Конструктор которого определен следующим образом:
public Uniform(ShaderProgram shaderProgram, string name)
{
if (shaderProgram == null) throw new ArgumentNullException("shaderProgram");
if (Regex.IsMatch(name, @"\s")) throw new ArgumentException("Cannot contain white space.", "name");
if (name.StartsWith("gl_")) throw new ArgumentException("Cannot start with reserved prefix \"gl_\"", "name");
Location = shaderProgram.GetUniformLocation(name);
if (Location < 0) throw new ArgumentException("Name does not correspond to an active uniform variable in program", "name");
}
x
и y
отлично работают, но когда он достигает width
генерируется исключение («Имя не соответствует ...»), т. е. glGetUniformLocation
возвращает -1.
Я не вижу никаких опечаток, и я только что проверил спецификацию GLSL 4.1, и этоне похоже, что "ширина" и "высота" не являются ключевыми словами .... так почему еще это может быть неудачным?