У меня есть координата 3D, которую я хочу преобразовать с помощью матрицы modelVeiw, чтобы получить пространство вида в шейдере GLSL. Точка определена в шейдере и не подвержена трансформациям OpenGL. Есть ли способ сделать что-то вроде gl_ModelViewMatrix * (имя vec3)?Умножьте a vec3 по матрице модели
ответ
No. gl_ModelViewMatrix - mat4. Вам нужно умножить его на vec4 (с 1 в w).
Спасибо! Я бы проголосовал за это, но я такой noob, у меня нет достаточной репутации ... – Abaab
Содержимое w должно определяться с помощью точки - это регулярная вершина, которая должна быть преобразована, или нормальная (в этом случае w = 0, а также можно умножить vec3 на верхнюю матрицу 3x3 MVM.) –
Вся наша семантика была отрывочной. Я думал, что «координата» является синонимом «точки» и не может означать вектор, но я просто искал его, и я ошибся. Вы используете «точку» для обозначения «точки» или «вектора/направления», что также неверно. Вы не должны технически выполнять mat3 (MVM) * normal; вы должны сделать нормальный * inverseOfMVM. http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations#Transforming_Normal_Vectors – Jessy
Почтовый код – GreenGuerilla
Обычно вершинный шейдер имеет значение 'void main() {gl_position = glMatrix * aVertex; } 'где aVertex - это атрибут, а glMatrix - униформа. Оба они могут быть сгенерированы внутри шейдера. Просто сделай это! –
@AkiSuihkonen Когда я запускаю код vec3 tfLightPos = (gl_ModelViewMatrix * lightPos); Я получаю ошибку 0 (8): ошибка C1101: неоднозначная перегруженная функция ссылки «mul (mat4, vec3)» – Abaab