Как мы знаем, почти все программное обеспечение 3D имеет ось XYZ в секции просмотра. Предположим, что нарисовать такую координатную ось. Вот мой метод.Почему этот код GLSL не работает на старой Intel-карте (openGL 2.1)?
Во-первых, существует функция с именем drawOneAxis() используется для рисования только одной оси. мы вызываем его три раз. Однако каждый раз, прежде чем рисовать ось, измените модельную матрицу так, чтобы мы могли перенести три оси перпендикулярно друг другу. Это какая функция changeUniform_MVP() сделать.
void draw()
{
for (int i = 0; i < 3; i++) // 0 - X axis, 1 - Y axis, 2 - Z axis
{
changeUniform_MVP(i);
drawOneAxis();
}
}
Vertex шейдеров:
#version 110
uniform mat4 MVP;
void main()
{
gl_Position = MVP * gl_Vertex;
}
В функции инициализации(), шейдер компилируется и связаны успешно, и мы получаем идентификатор программы под названием programID. В конце init() мы используем шейдер путем вызова glUseProgram (programID).
В результате на двух моих компьютерах:
PC 1: intel card, openGL 3.1, all is well
PC 2: intel card, openGL 2.1, only one axis is drew (Z axis)
Почему мы получаем два различных результата здесь?
One Magic вещь !!! Результат корректен на PC2 после добавления двух строк кода для работы draw().
void draw()
{
for (int i = 0; i < 3; i++)
{
glUseProgram(programID); // 1
changeUniform_MVP(i);
drawOneAxis();
glUseProgram(0); // 2
}
}
Кажется, мы должны сбросить программу каждый раз, когда мы рисуем что-то. Но я думаю, что это не нужно, потому что мы используем тот же шейдер, чтобы рисовать все. Я очень смущен этим.
Это ошибка старого драйвера карты Intel? Почему это нормально после добавления двух строк кода?