GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (100 стр.)

Сообщения на форуме пользователя Andrey (100 стр.)

Скелетная анимация работает с матрицами 4x4 не работает с матрицами 4x3(Проблема решена)15 сен. 20080:12#3
Wraith
>При отправке матриц в шейдер они транспонируются,
для этого я и поставил флаг D3DXSHADER_PACKMATRIX_ROWMAJOR что-бы слать матрицу "так как есть"  без транспонирования.
хранится она у мен вот так:
0  4  8    12
1  5  9    13
2  6  10  14
3  7  11  15
во всех матрицах 4x4 перспектива отсуствует(нули):
0.977212 0.009654 0.212044 2.615112
0.014345 0.993678 -0.111351 -1.379486
-0.211779 0.111856 0.970896 -13.755972
0.000000 0.000000 0.000000 1.000000
аналогичная матрица только 4x3 выглядит так -же только без нижней строки
0.977212 0.009654 0.212044 2.615112
0.014345 0.993678 -0.111351 -1.379486
-0.211779 0.111856 0.970896 -13.755972
и засылаються все они аналогично, разница только в размере. Более того все 2 матрицы содержат все что нужно 3x3 + позиция
в соответвующих позициях элементов.
ну и судя по коду шейдера для матрицы 4x3 отсутствует инструкция
mad r0.xyz, v0.w, c7[a0.y], r0
с нижней строкой в остальном все аналогично.
>транспонирующая и упаковывающая матрицы в шейдер в виде 4х3
а не будет это дополнительная нагрузка на CPU ведь паковать нужно десятки матриц да еще для десятков объектов в кадре?
kas
>надо 4х3 ну или с другой стороны умножать
тогда размер будет занимать 4 регистра.
Скелетная анимация работает с матрицами 4x4 не работает с матрицами 4x3(Проблема решена)14 сен. 200819:10#0
Привет всем!
в общем решал оптимизировать передачу констант в шейдеры переходом с матриц 4x4 на матрицы 4x3 (матрица поворота 3x3 + позиция). Скелетная матрица с использованием матриц 4x4 работает верно.
Написал класс матрицы 4x3 на основе класса матрицы 4x4 убрав нижнюю строку.
в результате модель двигается неверно, хотя скелет выглядит корректно.
Вот скриншоты поясняющий проблему при тесте 1 из моделей:
это случай матриц 4x3:
anim4x3 | Скелетная анимация работает с матрицами 4x4 не работает с матрицами 4x3(Проблема решена)
это случай матри 4x4
anim4x4 | Скелетная анимация работает с матрицами 4x4 не работает с матрицами 4x3(Проблема решена)
видно на 1 скриншоте что кости стоят на месте и скелет верный.
В процессе отладки я решил написать  небольшой код который вводит весь массив матриц перед отправкой в шейдер в случае матриц 4x4 и в случае с матрицами 4x3, c одним и и тем-же временем кадра, что-бы ясно было, что в расчете иерархии и финальных матриц используются одинаковые исходные данные кадра(кватернион + позиция). Данный код выводит массив матриц в файл. Вот что получилось в результате:
финальные матрицы 4x3(для 49 костей) для кадра с dt = 11:
0
0.977212 0.009654 0.212044 2.615112
0.014345 0.993678 -0.111351 -1.379486
-0.211779 0.111856 0.970896 -13.755972

1
0.995684 0.014239 0.091713 1.845810
-0.010158 0.998944 -0.044817 -0.322273
-0.092254 0.043692 0.994777 -4.358837

2
0.965836 -0.152625 0.209444 24.069401
0.191898 0.964357 -0.182184 -1.599426
-0.174173 0.216152 0.960699 -29.331474

3
0.990881 -0.131568 -0.029068 16.369078
0.116038 0.942902 -0.312203 -0.010849
0.068484 0.305983 0.949571 -45.300846
...
48
0.649973 0.127656 0.749159 -0.993583
-0.126537 0.990209 -0.058946 1.580429
-0.749349 -0.056483 0.659762 7.009441
аналогично,4x4(для 49 костей) для кадра с dt = 11:
0
0.977212 0.009654 0.212044 2.615112
0.014345 0.993678 -0.111351 -1.379486
-0.211779 0.111856 0.970896 -13.755972
0.000000 0.000000 0.000000 1.000000

1
0.995684 0.014239 0.091713 1.845810
-0.010158 0.998944 -0.044817 -0.322273
-0.092254 0.043692 0.994777 -4.358837
0.000000 0.000000 0.000000 1.000000

2
0.965836 -0.152625 0.209444 24.069401
0.191898 0.964357 -0.182184 -1.599426
-0.174173 0.216152 0.960699 -29.331474
0.000000 0.000000 0.000000 1.000000

3
0.990881 -0.131568 -0.029068 16.369078
0.116038 0.942902 -0.312203 -0.010849
0.068484 0.305983 0.949571 -45.300846
0.000000 0.000000 0.000000 1.000000
...
48
0.649973 0.127656 0.749159 -0.993583
-0.126537 0.990209 -0.058946 1.580429
-0.749349 -0.056483 0.659762 7.009441
0.000000 0.000000 0.000000 1.000000
Как видно из результатов все операции по матрицам в классе матрицы 4x3 работают правильно, а именно матрица из кватерниона, перемножение матриц, установка позиции в матрицы)
я думал что как-то используется нижняя строка в матрицы 4x4 и при переделки на матрицы 4x3 она будет отствовать, и как-то влиять на результат
на всякий случай я поставил проверку.
assert[!mat[3]);
assert[!mat[7]);
assert[!mat[11]);
но assert'ы не срабатывали.
я подозреваю что-то это связано с неправильным шейдером или передачей констант.
флаги используемые при компиляции:
[code = cpp]
D3DXSHADER_OPTIMIZATION_LEVEL3 | D3DXSHADER_SKIPVALIDATION 
    | D3DXSHADER_PARTIALPRECISION | D3DXSHADER_PACKMATRIX_ROWMAJOR
[code]
вот код шейдера использующийся для скелетной анимации:
//
uniform float4x4 WorldViewProj : WorldViewProj;
#ifdef MATRIX4x3
uniform float3x4 bones[NUM_BONES] : register(c4);
#else
uniform float4x4 bones[NUM_BONES] : register(c4);
#endif

struct VS { 
    float4  Pos             : POSITION;
    float4  BlendWeights    : BLENDWEIGHT;
    float4  BlendIndices    : BLENDINDICES;
    float3  Normal          : NORMAL;
    float2  Tex0            : TEXCOORD0;
};

struct PS { 
    float4  Pos             : POSITION;
    float2  Tex0            : TEXCOORD0;
};


PS vsMain(in VS In)
{
  PS Out;
  float4 Pos = float4(0.0f, 0.0f, 0.0f, 1.0f);
  for(int i = 0; i < 4; ++i) {
    Pos.xyz += (mul(In.Pos, bones[In.BlendIndices[i]]).xyz * In.BlendWeights[i]);
  }
  Out.Pos = mul(Pos, WorldViewProj);
  Out.Tex0 = In.Tex0;    
  return Out;
}
Ассемблерный код для случая 4x4:
// Generated by Microsoft (R) HLSL Shader Compiler 9.23.949.2378
//
// Parameters:
//
//   row_major float4x4 WorldViewProj;
//   row_major float4x4 bones[49];
//
//
// Registers:
//
//   Name          Reg   Size
//   ------------- ----- ----
//   WorldViewProj c0       4
//   bones         c4     196
//

    vs_2_0
    def c200, 4, 0, 0, 0
    dcl_position v0
    dcl_blendweight v1
    dcl_blendindices v2
    dcl_texcoord v3
    frc r0, v2
    add r0, -r0, v2
    mul r0, r0, c200.x
    mova a0, r0
    mul r0.xyz, v0.y, c5[a0.y]
    mad r0.xyz, v0.x, c4[a0.y], r0
    mad r0.xyz, v0.z, c6[a0.y], r0
    mad r0.xyz, v0.w, c7[a0.y], r0
    mul r0.xyz, r0, v1.y
    mul r1.xyz, v0.y, c5[a0.x]
    mad r1.xyz, v0.x, c4[a0.x], r1
    mad r1.xyz, v0.z, c6[a0.x], r1
    mad r1.xyz, v0.w, c7[a0.x], r1
    mad r0.xyz, r1, v1.x, r0
    mul r1.xyz, v0.y, c5[a0.z]
    mad r1.xyz, v0.x, c4[a0.z], r1
    mad r1.xyz, v0.z, c6[a0.z], r1
    mad r1.xyz, v0.w, c7[a0.z], r1
    mad r0.xyz, r1, v1.z, r0
    mul r1.xyz, v0.y, c5[a0.w]
    mad r1.xyz, v0.x, c4[a0.w], r1
    mad r1.xyz, v0.z, c6[a0.w], r1
    mad r1.xyz, v0.w, c7[a0.w], r1
    mad r0.xyz, r1, v1.w, r0
    mul r1, r0.y, c1
    mad r1, r0.x, c0, r1
    mad r0, r0.z, c2, r1
    add oPos, r0, c3
    mov oT0.xy, v3

// approximately 29 instruction slots used
Ассемблерный код для случая 4x3:
// Generated by Microsoft (R) HLSL Shader Compiler 9.23.949.2378
//
// Parameters:
//
//   row_major float4x4 WorldViewProj;
//   row_major float3x4 bones[49];
//
//
// Registers:
//
//   Name          Reg   Size
//   ------------- ----- ----
//   WorldViewProj c0       4
//   bones         c4     147
//

    vs_2_0
    def c151, 3, 0, 0, 0
    dcl_position v0
    dcl_blendweight v1
    dcl_blendindices v2
    dcl_texcoord v3
    frc r0, v2
    add r0, -r0, v2
    mul r0, r0, c151.x
    mova a0, r0
    mul r0.xyz, v0.y, c5[a0.y]
    mad r0.xyz, v0.x, c4[a0.y], r0
    mad r0.xyz, v0.z, c6[a0.y], r0
    mul r0.xyz, r0, v1.y
    mul r1.xyz, v0.y, c5[a0.x]
    mad r1.xyz, v0.x, c4[a0.x], r1
    mad r1.xyz, v0.z, c6[a0.x], r1
    mad r0.xyz, r1, v1.x, r0
    mul r1.xyz, v0.y, c5[a0.z]
    mad r1.xyz, v0.x, c4[a0.z], r1
    mad r1.xyz, v0.z, c6[a0.z], r1
    mad r0.xyz, r1, v1.z, r0
    mul r1.xyz, v0.y, c5[a0.w]
    mad r1.xyz, v0.x, c4[a0.w], r1
    mad r1.xyz, v0.z, c6[a0.w], r1
    mad r0.xyz, r1, v1.w, r0
    mul r1, r0.y, c1
    mad r1, r0.x, c0, r1
    mad r0, r0.z, c2, r1
    add oPos, r0, c3
    mov oT0.xy, v3

// approximately 25 instruction slots used
Видно что лдля матрицы 4x3 корректно соответвует число регистров = 3 (12 float).
Что еще может быть не так?
Спасибо всем заранее. С Уважением Андрей.

Правка: 16 сен. 2008 23:53

Нужен ли сейчас протокол DirectPlay?11 сен. 200819:12#2
Misticial
Miceosoft не рекомендует его использовать. Используй Winsock API.
Перемножение матриц средствами SSE8 сен. 200816:50#3
Hotwire
порядок умножения поменяй
Какой-то странный баг в GLSL8 сен. 200816:43#13
SNVampyre
Вообще у меня из Cg кода формируется шейдер для отрисовки в Depth для Shadow Map. там 1 uniform это матрица источника света. как ни странно но он работает!
да еще на ATI(X300SE, X1300) c Vista. Само собой никаких встроенных uniform Cg не вставляет в код(видать сделано для OpenGL 3.0)
так что попробуй минимизировать ошибку.
Какой-то странный баг в GLSL8 сен. 200816:38#12
SNVampyre
да уж... у меня вусе как ты сказал после подмена шейдера появился текст. ATI 9600, дрова 8.8.
D3DXCompileShaderFromFile шейдер работает в ps_2_0 не работает ps_3_08 сен. 200811:58#3
если Visual C++ 2003 то Options->Debugging->DirectX->Use Debug Version Direct3D поставь галки Maximum Validation отверти слидер Debug Output Level побольше.
Или все это в Control Panel->DirectX
еще в папке установки DirectX sdk Utilites/Bin/x86/dxcpl.exe
D3DXCompileShaderFromFile шейдер работает в ps_2_0 не работает ps_3_08 сен. 200810:56#1
DX Debug что говорит?
вершинный шейдер 3.0 версии должен быть, про это знаешь?
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать?8 сен. 20080:58#23
slava_mib
>Если же это просто "обёртка" над ДХ, физиксом и ангел-скриптом - то смысла никакого, каждый школьник в наше время соберёт >такое на коленке за неделю.
ну к примеру портальную систему уже не накатаешь за недельку. Тут уже нет "оберток"
в остальном согласен с тобой.
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать?8 сен. 20080:21#21
dev
глянул я демку
060403_exhibition_demo.rar
очень даже неплохо. 8600GT 500 FPS в среднем. Не знаю быстро или нет это. Сцена простая.
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать?7 сен. 200821:18#15
dev
Скелетная анимация есть?формат моделей чей? Х?
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать?7 сен. 200817:12#4
dev
>но основное направление - шутер, и рендер закрытых помещений (портально-секторная система отсичений) с возможностью >рендера открытых (но пока только с использованием octree).
отлично!
покажи скрины? уровень движка хороший?
опиши его возможности. Я бы хотел нахвататься опыта побольше.
Виста падает при запуске программы(SDL, OpenGL)5 сен. 200814:11#19
On1x
glut кросплатформенная бибилиотека
Виста падает при запуске программы(SDL, OpenGL)5 сен. 200812:59#17
Iskander
ну вполне возможно как еще объяснить это можно что собранный проект на 1 компиляторе работает корректно, а на другом нет.
Виста падает при запуске программы(SDL, OpenGL)5 сен. 200811:18#15
On1x
>Наверное, дело в devcpp
угу c ошибками написана C Run Time Library в частости stdio.
если нет возможности использовать Visual C++ то попробуй Code Blocks(www.codeblocks.org) + gcc(MinGW www.mingw.org)
>Пените кто-нибудь в нужном направлении - на какую-нибудь либу для вывода текста в opengl.
текс можно выводить использую glut, глянь еще feetype(www.freetype.org) но там сложнее.

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр