QGLShaderProgram :: setAttributeArray (0,…) VERSUS QGLShaderProgram :: setAttributeArray («позиция»,…)

0

У меня есть вершинный шейдер:

#version 430
in vec4 position;

void main(void)
{
    //gl_Position = position; => works in ALL cases
    gl_Position = vec4(0,0,0,1);
}

если я сделаю:

m_program.setAttributeArray(0, m_vertices.constData());
m_program.enableAttributeArray(0);

все работает нормально. Однако, если я это сделаю:

m_program.setAttributeArray("position", m_vertices.constData());
m_program.enableAttributeArray("position");

ПРИМЕЧАНИЕ: m_program.attributeLocation("position"); возвращает -1.

то я получаю пустое окно.

Сопутствующие страницы Qt:

void QGLShaderProgram :: setAttributeArray (int location, const QVector3D * values, int stride = 0)

Устанавливает массив значений трехмерных вершин в атрибуте в месте в этой шейдерной программе. Шаг указывает количество байтов между вершинами. Значение шага по умолчанию, равное нулю, указывает, что вершины плотно упакованы в значения.

Массив станет активным, если в местоположении вызывается enableAttributeArray(). В противном случае будет использоваться значение, указанное с помощью setAttributeValue() для местоположения.

а также

void QGLShaderProgram :: setAttributeArray (const char * name, const QVector3D * values, int stride = 0)

Это перегруженная функция.

Устанавливает массив значений трехмерных вершин в атрибуте с именем name в этой шейдерной программе. Шаг указывает количество байтов между вершинами. Значение шага по умолчанию, равное нулю, указывает, что вершины плотно упакованы в значения.

Массив станет активным, когда enableAttributeArray() вызывается по имени. В противном случае будет использоваться значение, указанное с помощью setAttributeValue() для имени.

Так почему он работает при использовании " int версии", а не при использовании " const char * version"?

  • 1
    что вы получаете от m_program.attributeLocation("position"); ?
  • 1
    Возвращает -1. Так что это связано с тем, что атрибут position не используется и может быть «очищен» при компиляции шейдера. Правильно? Тогда почему он все еще работает при использовании int?
Показать ещё 2 комментария
Теги:
opengl
qt

1 ответ

1
Лучший ответ

Он возвращает -1, потому что вы прокомментировали единственную строку в своем шейдере, которая фактически использует position.

Это не ошибка, это следствие неправильного понимания того, как назначаются местоположения атрибутов. Униформам и атрибутам присваиваются только местоположения после того, как все стадии шейдера скомпилированы и связаны. Если унифицированный или атрибут не используется в активном пути кода, ему не будет назначено местоположение. Даже если вы используете переменную, чтобы сделать что-то вроде этого:

#version 130

in vec4 dead_pos; // Location: N/A
in vec4 live_pos; // Location: Probably 0

void main (void)
{
  vec4 not_used = dead_pos; // Not used for vertex shader output, so this is dead.
  gl_Position   = live_pos;
}

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

Атрибут атрибута вершины 0, между прочим, является неявным вершинным положением. Это единственный атрибут вершины, который специфицирует GLSL. позволяет псевдоним функции указателя фиксированной функции (например, glVertexPointer (...) == glVertexAttribPointer (0,...))

  • 0
    Msgstr "Расположение атрибута вершины 0 - неявно положение вершины". Спасибо! Это объясняет, почему он «работает» при прохождении 0, а не при прохождении «location».
  • 0
    Где я могу найти информацию в официальной ссылке о том, что "атрибут 0 вершины - это неявно позиция вершины"?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню