Ошибка glGetUniformLocation для 2/4 полей в структуре? - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть структура, определенная в моем 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, и этоне похоже, что "ширина" и "высота" не являются ключевыми словами .... так почему еще это может быть неудачным?

1 Ответ

5 голосов
/ 13 февраля 2012

glGetUniformLocation разрешено, для удобства видеодрайверов, возвращать -1, если запрашиваемая униформа фактически не используется шейдером (например, без зачистки).Это не ошибка - изменения в униформе через glUniform* будут игнорироваться.Но это означает, что вам нужно рассматривать -1 как правильное единообразное расположение.

Кстати, это, вероятно, хорошая вещь для отделения шейдеров от вашего рендеринга - ваш код может просто выбросить все соответствующие значения в шейдерне беспокойтесь о том, какие из них действительно нужны шейдерам.Это также означает, что вы можете проверить, действительно ли шейдер использует значение, и не вычислять его в первую очередь, если оно не нужно.

...