Сообщения на форуме пользователя Andrey (100 стр.)
Скелетная анимация работает с матрицами 4x4 не работает с матрицами 4x3(Проблема решена) | 15 сен. 2008 | 0: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 регистра.
>При отправке матриц в шейдер они транспонируются,
для этого я и поставил флаг 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 сен. 2008 | 19:10 | #0 |
---|
Привет всем!
в общем решал оптимизировать передачу констант в шейдеры переходом с матриц 4x4 на матрицы 4x3 (матрица поворота 3x3 + позиция). Скелетная матрица с использованием матриц 4x4 работает верно.
Написал класс матрицы 4x3 на основе класса матрицы 4x4 убрав нижнюю строку.
в результате модель двигается неверно, хотя скелет выглядит корректно.
Вот скриншоты поясняющий проблему при тесте 1 из моделей:
это случай матриц 4x3:
это случай матри 4x4
видно на 1 скриншоте что кости стоят на месте и скелет верный.
В процессе отладки я решил написать небольшой код который вводит весь массив матриц перед отправкой в шейдер в случае матриц 4x4 и в случае с матрицами 4x3, c одним и и тем-же временем кадра, что-бы ясно было, что в расчете иерархии и финальных матриц используются одинаковые исходные данные кадра(кватернион + позиция). Данный код выводит массив матриц в файл. Вот что получилось в результате:
финальные матрицы 4x3(для 49 костей) для кадра с dt = 11:
аналогично,4x4(для 49 костей) для кадра с dt = 11:
Как видно из результатов все операции по матрицам в классе матрицы 4x3 работают правильно, а именно матрица из кватерниона, перемножение матриц, установка позиции в матрицы)
я думал что как-то используется нижняя строка в матрицы 4x4 и при переделки на матрицы 4x3 она будет отствовать, и как-то влиять на результат
на всякий случай я поставил проверку.
но assert'ы не срабатывали.
Ассемблерный код для случая 4x4:
Ассемблерный код для случая 4x3:
Видно что лдля матрицы 4x3 корректно соответвует число регистров = 3 (12 float).
Что еще может быть не так?
Спасибо всем заранее. С Уважением Андрей.
в общем решал оптимизировать передачу констант в шейдеры переходом с матриц 4x4 на матрицы 4x3 (матрица поворота 3x3 + позиция). Скелетная матрица с использованием матриц 4x4 работает верно.
Написал класс матрицы 4x3 на основе класса матрицы 4x4 убрав нижнюю строку.
в результате модель двигается неверно, хотя скелет выглядит корректно.
Вот скриншоты поясняющий проблему при тесте 1 из моделей:
это случай матриц 4x3:

это случай матри 4x4

видно на 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
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
я думал что как-то используется нижняя строка в матрицы 4x4 и при переделки на матрицы 4x3 она будет отствовать, и как-то влиять на результат
на всякий случай я поставил проверку.
assert[!mat[3]); assert[!mat[7]); assert[!mat[11]);
я подозреваю что-то это связано с неправильным шейдером или передачей констант. флаги используемые при компиляции: [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; } |
// 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
// 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
Что еще может быть не так?
Спасибо всем заранее. С Уважением Андрей.
Правка: 16 сен. 2008 23:53
Нужен ли сейчас протокол DirectPlay? | 11 сен. 2008 | 19:12 | #2 |
---|
Misticial
Miceosoft не рекомендует его использовать. Используй Winsock API.
Miceosoft не рекомендует его использовать. Используй Winsock API.
Перемножение матриц средствами SSE | 8 сен. 2008 | 16:50 | #3 |
---|
Hotwire
порядок умножения поменяй
порядок умножения поменяй
Какой-то странный баг в GLSL | 8 сен. 2008 | 16:43 | #13 |
---|
SNVampyre
Вообще у меня из Cg кода формируется шейдер для отрисовки в Depth для Shadow Map. там 1 uniform это матрица источника света. как ни странно но он работает!
да еще на ATI(X300SE, X1300) c Vista. Само собой никаких встроенных uniform Cg не вставляет в код(видать сделано для OpenGL 3.0)
так что попробуй минимизировать ошибку.
Вообще у меня из Cg кода формируется шейдер для отрисовки в Depth для Shadow Map. там 1 uniform это матрица источника света. как ни странно но он работает!
да еще на ATI(X300SE, X1300) c Vista. Само собой никаких встроенных uniform Cg не вставляет в код(видать сделано для OpenGL 3.0)
так что попробуй минимизировать ошибку.
Какой-то странный баг в GLSL | 8 сен. 2008 | 16:38 | #12 |
---|
SNVampyre
да уж... у меня вусе как ты сказал после подмена шейдера появился текст. ATI 9600, дрова 8.8.
да уж... у меня вусе как ты сказал после подмена шейдера появился текст. ATI 9600, дрова 8.8.
D3DXCompileShaderFromFile шейдер работает в ps_2_0 не работает ps_3_0 | 8 сен. 2008 | 11: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
Или все это в Control Panel->DirectX
еще в папке установки DirectX sdk Utilites/Bin/x86/dxcpl.exe
D3DXCompileShaderFromFile шейдер работает в ps_2_0 не работает ps_3_0 | 8 сен. 2008 | 10:56 | #1 |
---|
DX Debug что говорит?
вершинный шейдер 3.0 версии должен быть, про это знаешь?
вершинный шейдер 3.0 версии должен быть, про это знаешь?
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать? | 8 сен. 2008 | 0:58 | #23 |
---|
slava_mib
>Если же это просто "обёртка" над ДХ, физиксом и ангел-скриптом - то смысла никакого, каждый школьник в наше время соберёт >такое на коленке за неделю.
ну к примеру портальную систему уже не накатаешь за недельку. Тут уже нет "оберток"
в остальном согласен с тобой.
>Если же это просто "обёртка" над ДХ, физиксом и ангел-скриптом - то смысла никакого, каждый школьник в наше время соберёт >такое на коленке за неделю.
ну к примеру портальную систему уже не накатаешь за недельку. Тут уже нет "оберток"
в остальном согласен с тобой.
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать? | 8 сен. 2008 | 0:21 | #21 |
---|
dev
глянул я демку
060403_exhibition_demo.rar
очень даже неплохо. 8600GT 500 FPS в среднем. Не знаю быстро или нет это. Сцена простая.
глянул я демку
060403_exhibition_demo.rar
очень даже неплохо. 8600GT 500 FPS в среднем. Не знаю быстро или нет это. Сцена простая.
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать? | 7 сен. 2008 | 21:18 | #15 |
---|
dev
Скелетная анимация есть?формат моделей чей? Х?
Скелетная анимация есть?формат моделей чей? Х?
Игровой движок. Небольшая дема + исходники. Есть желающие поучаствовать? | 7 сен. 2008 | 17:12 | #4 |
---|
dev
>но основное направление - шутер, и рендер закрытых помещений (портально-секторная система отсичений) с возможностью >рендера открытых (но пока только с использованием octree).
отлично!
покажи скрины? уровень движка хороший?
опиши его возможности. Я бы хотел нахвататься опыта побольше.
>но основное направление - шутер, и рендер закрытых помещений (портально-секторная система отсичений) с возможностью >рендера открытых (но пока только с использованием octree).
отлично!
покажи скрины? уровень движка хороший?
опиши его возможности. Я бы хотел нахвататься опыта побольше.
Виста падает при запуске программы(SDL, OpenGL) | 5 сен. 2008 | 14:11 | #19 |
---|
On1x
glut кросплатформенная бибилиотека
glut кросплатформенная бибилиотека
Виста падает при запуске программы(SDL, OpenGL) | 5 сен. 2008 | 12:59 | #17 |
---|
Iskander
ну вполне возможно как еще объяснить это можно что собранный проект на 1 компиляторе работает корректно, а на другом нет.
ну вполне возможно как еще объяснить это можно что собранный проект на 1 компиляторе работает корректно, а на другом нет.
Виста падает при запуске программы(SDL, OpenGL) | 5 сен. 2008 | 11: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) но там сложнее.
>Наверное, дело в 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) но там сложнее.