Матрицы

Шейдеры и все-все-все.

Матрицы

Сообщение PetkaGtA 14 окт 2011, 16:58

Есть вопрос: как реализовать матрицу инверсии вида и теней? С тенями вроде понятно, что то вроде позиции света помноженной на нормали какого то плэйна, только вот что за плэйн непонятно. А вот с матрицей инверсии вида не очень.
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05

Re: Матрицы

Сообщение burlak 15 окт 2011, 13:19

Прости мою неграмотность. Что такое инверсная матрица вида?
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Матрицы

Сообщение PetkaGtA 15 окт 2011, 13:27

burlak писал(а):Прости мою неграмотность. Что такое инверсная матрица вида?

inverse view matrix я нашел вот это но не совсем понимаю как реализовать: http://www.gamedev.net/topic/288155-how ... ew-matrix/
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05

Re: Матрицы

Сообщение burlak 15 окт 2011, 14:55

Понятно - инвертированная матрица камеры. А зачем без использование функции inverse()?
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Матрицы

Сообщение PetkaGtA 15 окт 2011, 17:28

burlak писал(а):Понятно - инвертированная матрица камеры. А зачем без использование функции inverse()?

по моему в cg и hlsl она не работает
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05

Re: Матрицы

Сообщение gnoblin 15 окт 2011, 17:42

В помощь:
http://unity3d.com/support/documentatio ... grams.html
UnityCG.cginc, AutoLight.cginc.

А что ты хочешь сделать?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Матрицы

Сообщение PetkaGtA 16 окт 2011, 23:27

это все для определенной модели отражения ну и освещения(с матрицей теней разобрался) только я не очень понимаю можно ли инверсировать посредством минуса(хотя я думаю будет не то)
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05

Re: Матрицы

Сообщение burlak 17 окт 2011, 03:25

Камера всего одна? Может просто передать в шейдер инвертированную матрицу вида снаружи?
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Матрицы

Сообщение gnoblin 17 окт 2011, 09:40

нет, минусом нельзя))
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Матрицы

Сообщение PetkaGtA 17 окт 2011, 17:06

burlak писал(а):Камера всего одна? Может просто передать в шейдер инвертированную матрицу вида снаружи?

хотелось бы все-таки сделать шейдерным кодом
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05

Re: Матрицы

Сообщение burlak 17 окт 2011, 19:52

ну тогда придется написать свою функцию инвертирования. за основу можно взять общедоступные исходники, например:

Синтаксис:
Используется csharp
void MatrixInverse(
        MATRIX                  &mOut,
        const MATRIX    &mIn)
{
        MATRIX  mDummyMatrix;
        double          det_1;
        double          pos, neg, temp;

    /* Calculate the determinant of submatrix A and determine if the
       the matrix is singular as limited by the double precision
       floating-point data representation. */

    pos = neg = 0.0;
    temp =  mIn.f[ 0] * mIn.f[ 5] * mIn.f[10];
    if (temp >= 0.0) pos += temp; else neg += temp;
    temp =  mIn.f[ 4] * mIn.f[ 9] * mIn.f[ 2];
    if (temp >= 0.0) pos += temp; else neg += temp;
    temp =  mIn.f[ 8] * mIn.f[ 1] * mIn.f[ 6];
    if (temp >= 0.0) pos += temp; else neg += temp;
    temp = -mIn.f[ 8] * mIn.f[ 5] * mIn.f[ 2];
    if (temp >= 0.0) pos += temp; else neg += temp;
    temp = -mIn.f[ 4] * mIn.f[ 1] * mIn.f[10];
    if (temp >= 0.0) pos += temp; else neg += temp;
    temp = -mIn.f[ 0] * mIn.f[ 9] * mIn.f[ 6];
    if (temp >= 0.0) pos += temp; else neg += temp;
    det_1 = pos + neg;

    /* Is the submatrix A singular? */
    if ((det_1 == 0.0) || (_ABS(det_1 / (pos - neg)) < 1.0e-15))
        {
        /* Matrix M has no inverse */
        printf("Matrix has no inverse : singular matrix\n");
        return;
    }
    else
        {
        /* Calculate inverse(A) = adj(A) / det(A) */
        det_1 = 1.0 / det_1;
        mDummyMatrix.f[ 0] =   ( mIn.f[ 5] * mIn.f[10] - mIn.f[ 9] * mIn.f[ 6] ) * (float)det_1;
        mDummyMatrix.f[ 1] = - ( mIn.f[ 1] * mIn.f[10] - mIn.f[ 9] * mIn.f[ 2] ) * (float)det_1;
        mDummyMatrix.f[ 2] =   ( mIn.f[ 1] * mIn.f[ 6] - mIn.f[ 5] * mIn.f[ 2] ) * (float)det_1;
        mDummyMatrix.f[ 4] = - ( mIn.f[ 4] * mIn.f[10] - mIn.f[ 8] * mIn.f[ 6] ) * (float)det_1;
        mDummyMatrix.f[ 5] =   ( mIn.f[ 0] * mIn.f[10] - mIn.f[ 8] * mIn.f[ 2] ) * (float)det_1;
        mDummyMatrix.f[ 6] = - ( mIn.f[ 0] * mIn.f[ 6] - mIn.f[ 4] * mIn.f[ 2] ) * (float)det_1;
        mDummyMatrix.f[ 8] =   ( mIn.f[ 4] * mIn.f[ 9] - mIn.f[ 8] * mIn.f[ 5] ) * (float)det_1;
        mDummyMatrix.f[ 9] = - ( mIn.f[ 0] * mIn.f[ 9] - mIn.f[ 8] * mIn.f[ 1] ) * (float)det_1;
        mDummyMatrix.f[10] =   ( mIn.f[ 0] * mIn.f[ 5] - mIn.f[ 4] * mIn.f[ 1] ) * (float)det_1;

        /* Calculate -C * inverse(A) */
        mDummyMatrix.f[12] = - ( mIn.f[12] * mDummyMatrix.f[ 0] + mIn.f[13] * mDummyMatrix.f[ 4] + mIn.f[14] * mDummyMatrix.f[ 8] );
        mDummyMatrix.f[13] = - ( mIn.f[12] * mDummyMatrix.f[ 1] + mIn.f[13] * mDummyMatrix.f[ 5] + mIn.f[14] * mDummyMatrix.f[ 9] );
        mDummyMatrix.f[14] = - ( mIn.f[12] * mDummyMatrix.f[ 2] + mIn.f[13] * mDummyMatrix.f[ 6] + mIn.f[14] * mDummyMatrix.f[10] );

        /* Fill in last row */
        mDummyMatrix.f[ 3] = 0.0f;
                mDummyMatrix.f[ 7] = 0.0f;
                mDummyMatrix.f[11] = 0.0f;
        mDummyMatrix.f[15] = 1.0f;
        }

        /* Copy contents of dummy matrix in pfMatrix */
        mOut = mDummyMatrix;
}
 


Хотя... Разве в OpenGL нет функции inverse()?
С уважением, Дмитрий Бурлаков.
skype: dmitry.burlakov
email: _dmitry.burlakov@gmail.com
Аватара пользователя
burlak
UNITрон
 
Сообщения: 326
Зарегистрирован: 28 янв 2010, 10:21
Откуда: Санкт-Петербург

Re: Матрицы

Сообщение PetkaGtA 17 окт 2011, 20:20

спасибо за исходничёк буду пробовать
PetkaGtA
UNIт
 
Сообщения: 81
Зарегистрирован: 09 сен 2010, 10:05


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5