Кватернионы напрямую переводятся в матрицы вращения. В случае OpenGL матрица вращения - это верхняя левая подматрица 3 × 3. Нормалы преобразуются путем обратной транспонирования матрицы вида модели. Однако для чистых вращений, которые являются ортонормированными преобразованиями, обратное является транспонированием, поэтому получение обратной транспонирования матрицы чистого вращения является тождественным преобразованием.
Таким образом, вы можете просто передать свои кватернионы в виде vec4 в шейдер, построить там матрицу вращения 4 × 4, использовать ее непосредственно на нормали и умножить ее на gl_ModelViewMatrix, чтобы получить преобразование положения вершины .