Рабочий стол GLSL без ftransform () - PullRequest
3 голосов
/ 21 ноября 2011

Я портирую свою кодовую базу из OpenGL 1.x с фиксированной функцией на OpenGL 2.x - технически OpenGL ES 2.0, но я все еще пишу на настольном компьютере, просто учитывая ограничения, налагаемые ES 2.0которые похожи на «новый» профиль 3.1.

Проблема в том, что, как и во всем, кроме 2D, создание шейдера, передаваемого в матрицу проекции вида модели как униформа, не работает.Обычно я получаю черный экран, но если я установлю значение Z всех моих вершин на 0, я получу материал для отображения.

Установка моих шейдеров в RenderMonkey работает, когда у меня включен режим ES 2.0, но на стандартномрабочий стол GL это просто черный экран (без ошибок / предупреждений компилятора):

верт шейдер:

uniform mat4 mvp_matrix;
uniform mat4 obj_matrix;
uniform vec4 u_color;
attribute vec3 a_vertex;
attribute vec2 a_texcoord0;

varying vec4 v_color;
varying vec2 v_texcoord0;

void main(void)
{
   v_color = u_color;
   gl_Position = mvp_matrix * (obj_matrix * vec4(a_vertex, 1.0));
   v_texcoord0 = a_texcoord0;
}

фрагмент шейдера:

uniform sampler2D t_texture0;
varying vec2 v_texcoord0;
varying vec4 v_color;

void main(void)
{
   vec4 color = texture2D(t_texture0, v_texcoord0);
   gl_FragColor = color * v_color;
}

Я передаю вматрицы как glUniformMatrix4fv (местоположение, 1, GL_FALSE, mvpMatrix);Этот шейдер работает как золото для всего, что нарисовано в 2D.Что я здесь не так делаю?Или мне требуется для использования ftransform () на настольном компьютере GL?

1 Ответ

6 голосов
/ 30 декабря 2011

Мне кажется, нужно кое-что прояснить:

  • Матрица модели преобразует объект из координат объекта в мировые координаты.
  • Матрица представления преобразует мировые координаты в глазкоординаты.
  • Матрица проекции преобразует координаты глаза в координаты клипа.

Исходя из стандартных соглашений об именах, mvpMatrix представляет собой модель проекции * view *, в этом порядке.Нет других матриц, на которые вам нужно умножиться.Проекция - это матрица проекции (орто или перспектива), вид - это матрица преобразования камеры (НЕ вид модели), а модель - это положение, масштаб и поворот вашего объекта.

Я полагаю, что проблема заключается либо в том,в матрицах умножения, которые не нужно умножать вместе, или в матрицах умножения в неправильном порядке.(умножение матриц не является коммутативным)

Если вы еще не решили эту проблему, я бы порекомендовал отправить все 3 матрицы отдельно, а затем сбросить значения обратно, чтобы убедиться, что нет проблем с отправкой матриц.

Вершинный шейдер:

attribute vec4 a_vertex;
attribute vec2 a_texcoord0;

varying vec2 v_texcoord0;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main(void)
{
   gl_Position = projection * view * model * a_vertex;
   v_texcoord0 = a_texcoord0;
}

Фрагментный шейдер:

uniform sampler2D t_texture0;
uniform vec4 u_color;

varying vec2 v_texcoord0;

void main(void)
{
   vec4 color = texture2D(t_texture0, v_texcoord0);
   gl_FragColor = color * u_color;
}

Кроме того, я переместил цветовую форму в шейдер фрагмента, пропуская ее, так как изменение не требуется, когдавсе вершины будут одного цвета.

...