· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.DIRECTX.OPENGL —› GL_ARB_vertex_program, мать его

Посл.отвђт Сообщенiе


Дата: Июл 9, 2004 15:34:03

У меня тут на GL_ARB_vertex_program одна задача не получается...
Сама задача простейшая, на пересечение прямой и плоскости, поэтому я уверен что ошибка не в ее реализации (10 комманд которые я уже 100 раз пересмотрел). Мне кажется ошибка в подготовке. Вот мои действия (под мировыми координатами я буду подразумевать координаты соответствующие единичной матрице):

До vertex program:
1. Через glProgramLocalParameter4fARB передаем входные данные, а именно 3 вектора.
2. Через glProgramLocalParameter4fARB передаем model-view матрицу, которая была сразу после glLoadIdentity+gluLookAt

Внутри vertex program:
3. Умножаю vertex.position на state.matrix.modelview, тем самым переходя в мировые координаты.
4. Умножаю поочередно вектора из п.1 на матрицу из п.2, тем самым переходя в мировые координаты.
5. Все, я в единой системе. Выполняю свои расчеты, получаю новое значение вертекса.
6. На всякий случай полученному вертексу в w засылаю единицу (не смейтесь, все может быть).
7. Раз мы в мировых координатах, то state.matrix.modelview нам больше не нужна, и result.position я считаю как вертекс из п.6 умноженный на state.matrix.projection

И естественно нифига не работает.
Вот пара вопросов:

1. Правильно ли я передаю model-view матрицу с условием того, что умножать я буду след. образом...

Умножаем так:

DP4 Res.x,program.local[0],Input;
DP4 Res.y,program.local[1],Input;
DP4 Res.z,program.local[2],Input;
DP4 Res.w,program.local[3],Input;


Передаем так:

float M[16];
glGetFloatv(GL_MODELVIEW_MATRIX,M);
glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB,3,M[0],M[4],M[8],M[12]);
glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB,4,M[1],M[5],M[9],M[13]);
glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB,5,M[2],M[6],M[10],M[14]);
glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB,6,M[3],M[7],M[11],M[15]);


Это размышления по поводу того, где там строки, а где столбцы. У меня правильно?

2. Как на GL_ARB_vertex_program по-человечески разделить один скаляр на другой? Может это покажется идиотизмом, но я это делаю через POW, возводя в степень -1, а потом вместо деления юзаю MUL. Так вот не возникает ли в таком случае баги, если в степень возводится отрицательное число?

Вообщем товарищи... помогите кто чем сможет...


Дата: Июл 9, 2004 17:05:46 · Поправил: _DEN_

Все, заработало! Отвечаю:

1. Матрицу я передавал правильно.
2. Все остальные соображения по поводу матриц/систем координат тоже правильные.

Проблемма действительно была с возведением в степень. Не умеет он похоже отрицательные числа в степень возводить. Пишлось сделать так:

a*b = a * (b*pow(abs(b),-2))

Вот такой изврат :-)


Дата: Июл 9, 2004 23:19:20 · Поправил: _DEN_

Извиняюсь, конечно же деление, а не умножение:

a / b = a * (b*pow(abs(b),-2))

Так же довольно красиво (но, возможно не особо быстро) решил проблему с отсутствием бранчей, но это другая история... :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.089