2013-04-18 2 views
0

Как мы знаем, почти все программное обеспечение 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? Почему это нормально после добавления двух строк кода?

ответ

0

Трудно ответить. У старых драйверов Intel OpenGL есть проблемы.

drawThreeAxes() возможно?

 Смежные вопросы

  • Нет связанных вопросов^_^