Сообщения на форуме пользователя Andrey (84 стр.)
Демка намбер Ту. Наведение, огонь и движение ботов (+ патч в 0 посте) | 28 фев. 2009 | 18:13 | #4 |
---|
черный экран и только FPS и еще какая-то инфа.
вот лог:
Direct3D Create... Done! Init agePhysics... Done! Manager<ActorsType> adding object: Data\ObjectTypes\Actors\Tank.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\Robots\TankBody.xml Done! Objecter::AddMesh------->"Data\Meshes\Robots\TankBody.x" Objecter::AddTexture---->"Data\Textures\Robots\TankBody_COLOR.dds" Objecter::AddTexture---->"Data\Textures\Robots\TankBody_NRM.dds" Objecter::AddTexture---->"Data\Textures\Robots\TankBody_SPEC.dds" Objecter::AddTexture---->"Data\Textures\Robots\TankBody_EM.dds" Manager<DynObjectsType> adding object: Data\ObjectTypes\Actors\Tracks\CatTrack_R.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\Robots\CatTrack_R.xml Done! Objecter::AddMesh------->"Data\Meshes\Robots\CatTrack_R.x" Objecter::AddTexture---->"Data\Textures\Robots\CatTrack_COLOR.dds" Objecter::AddTexture---->"Data\Textures\Robots\CatTrack_NRM.dds" Objecter::AddTexture---->"Data\Textures\Robots\CatTrack_SPEC.dds" Manager<DynObjectsType> adding object: Data\ObjectTypes\Actors\Tracks\CatTrack_L.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\Robots\CatTrack_L.xml Done! Objecter::AddMesh------->"Data\Meshes\Robots\CatTrack_L.x" Manager<DynObjectsType> adding object: Data\ObjectTypes\Actors\Towers\Tower1.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\Robots\Towers\Tower1.xml Done! Objecter::AddMesh------->"Data\Meshes\Robots\Towers\Tower1.x" Objecter::AddTexture---->"Data\Textures\Robots\Towers\Tower1_COLOR.dds" Objecter::AddTexture---->"Data\Textures\Robots\Towers\Tower1_NRM.dds" Objecter::AddTexture---->"Data\Textures\Robots\Towers\Tower1_SPEC.dds" Manager<DynObjectsType> adding object: Data\ObjectTypes\Actors\Weapons\ImpBlaster.xml Done! Manager<SceneObjectsType> adding object: Data\ObjectTypes\Actors\Weapons\SceneObjects\ImpBlaster.xml Done! Objecter::AddMesh------->"Data\Meshes\Robots\Weapons\ImpBlaster.x" Objecter::AddTexture---->"Data\Textures\Robots\Weapons\ImpBlaster_COLOR.dds" Objecter::AddTexture---->"Data\Textures\Robots\Weapons\ImpBlaster_NRM.dds" Objecter::AddTexture---->"Data\Textures\Robots\Weapons\ImpBlaster_SPEC.dds" Manager<ParticlesType> adding object: Data\ObjectTypes\Particles\WepFire.xml Done! Manager<ParticlesType> adding object: Data\ObjectTypes\Particles\LittleSmoke.xml Done! Manager<DynObjectsType> adding object: Data\ObjectTypes\DynObjects\Barrels\OldBarrelBlue.xml Done! Manager<StatObjectsType> adding object: Data\ObjectTypes\StatObjects\Platforms\BigPlatform.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\BigPlatform.xml Done! Objecter::AddMesh------->"Data\Meshes\BigPlatform.x" Objecter::AddTexture---->"Data\Textures\LevelObjects\BigPlatform_COLOR.dds" Objecter::AddTexture---->"Data\Textures\LevelObjects\BigPlatform_NRM.dds" Objecter::AddTexture---->"Data\Textures\LevelObjects\BigPlatform_SPEC.dds" Manager<StatObjectsType> adding object: Data\ObjectTypes\StatObjects\PlatformElements\Tramplin.xml Done! Manager<SceneObjectsType> adding object: Data\Objects\Tramplin.xml Done! Objecter::AddMesh------->"Data\Meshes\Tramplin.X" Objecter::AddTexture---->"Data\Textures\LevelObjects\Tramplin_COLOR.dds" Objecter::AddTexture---->"Data\Textures\LevelObjects\Tramplin_NRM.dds" Objecter::AddTexture---->"Data\Textures\LevelObjects\Tramplin_SPEC.dds" Objecter::AddTexture---->"Data\Font.png" Manager<SceneObjectsType> adding object: Data\Objects\Barrel.xml Done! Objecter::AddMesh------->"Data\Meshes\Misc\Barrel.x" Objecter::AddTexture---->"Data\Textures\LevelObjects\Barrel_COLOR.png" Objecter::AddTexture---->"Data\Textures\LevelObjects\Barrel_NRM.png" Objecter::AddTexture---->"Data\Textures\LevelObjects\Barrel_SPEC.png" DirectInput init... Objecter::AddMesh------->"Data\Meshes\Other\PointLightVolume.x" Objecter::AddMesh------->"Data\Meshes\Other\SpotLightVolume.x" Objecter::AddTexture---->"Data\atten2D.jpg" Objecter::AddTexture---->"Data\atten1D.jpg" Objecter::AddTexture---->"Data\LightProj.jpg" Objecter::AddTexture---->"Data\Textures\Other\Jitter.jpg" Objecter::AddTexture---->"Data\Textures\Other\DefaultCubeMap.dds" Terminate agePhysics... Done! TEXT_LOG_SHUTDOWN TEXT_LOG_TERM |
C:\Program Files\AGEIA Technologies
driver
v2.4.0
v2.5.0
v2.6.0
v2.7.0
v2.8.0
v2.3.1
v2.4.1
v2.5.1
v2.6.1
v2.7.1
v2.8.1
v2.3.2
v2.5.2
v2.6.2
v2.7.2
v2.3.3
v2.5.3
v2.6.3
v2.7.3
v2.4.4
v2.5.4
v2.6.4
v2.7.4
v2.7.5
Двигатель «qPic» | 27 фев. 2009 | 21:23 | #25 |
---|
lib SDL и Vista. Получаю BSOD | 23 фев. 2009 | 16:58 | #15 |
---|
Vista SP1, nVidia 8600 GT, AMD Athlon 3200+. Все работает.
OpenGL 3.0 Модельно-видовые преобразования | 20 фев. 2009 | 8:53 | #52 |
---|
>Я не профессиональный 3-D программист, я преподаватель, работаю с детьми 13-17 лет. У меня есть разработанный мною >курс 3-D программирования на OpenGL(лекции, презентации, лабораторки на основе pascal, C/C++, python - полный цикл). В >основе курса лежит классический функционал, расширения и шейдеры только в концовке. Понимаю, что материалы курса >пора менять и поэтому стал подробно разбираться, что остается в основном API, а что переносится на плечи GLSL. >Разобраться в этом мне надо не просто, чтобы я понял, а так, чтобы я смог доходчиво объяснить детям и естественно внести >изменения в метод материал.
эх побольше бы таких преподавателей :) так держать!
Export. MaxAPI. | 19 фев. 2009 | 13:41 | #8 |
---|
>#include <iskin.h>
>получаю ошибки:
> c:\program files\autodesk\3ds max 2009 sdk\maxsdk\include\iskin.h(485) : error C2027: use of undefined type 'IParamBlock2'
> c:\program files\autodesk\3ds max 2009 sdk\maxsdk\include\plugapi.h(699) : see declaration of 'IParamBlock2'
>Мне нужен iskin. Низнаю что делать дальше.
>Как мне исправить ети ошибки?
#include <Max.h> #include <iparamm2.h> #include <modstack.h> #include <iskin.h>
ISkinContextData::GetBoneWeight
OpenGL 3.0 Модельно-видовые преобразования | 18 фев. 2009 | 13:12 | #16 |
---|
>Есть описание матриц в gl.
имеется ввиду реализация через FPU или SSE
>Как всегда нужно читать доки :)
а это причем тут?
OpenGL 3.0 Модельно-видовые преобразования | 18 фев. 2009 | 10:45 | #12 |
---|
перемножай матрица сам на CPU можно через SSE лиюбо возьми D3DX библиотеку(инициализация Direct3D не нужна)
неизвестно как выполнены всякие glRotate, glTranslate(хотя можно дизасемблировать что-то типа nvoglv32.dll, nvoglv32.dll и узнать там даже дебаг инфа оказывается есть) и все остальное используют ли они SSE.
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 17 фев. 2009 | 13:06 | #13 |
---|
>const Vector3D& lightPos = shadowMapDescription.lightPos; // позиция источника над камерой на высоте.
> const Vector3D& lightPoint = shadowMapDescription.lightPoint; // точка падения источника
>странно, источник направленный а какая то точка падения. что за позиция над камерой ???? как вычисляется?
>что за позиция над камерой
примерно 100 над камерой - задается из файла. подобрано экспериментальным путем.
а вот точка падения рассчитывается как смещение от камеры на величины то же задается из файла.
при движении камеры просто смещается точка падения и позиция - в результате направление остается постоянным.
можно конечно вместо точки падения задать направление.(на направление я просто рассчитываю)
да возможно это подход неверный и неудобный позже переделаю на направление. Не думаю это является.
>кстати у меня вот такой вопрос - ты шэдоумап не пробовал выводить прямо на экран?
>насколько я помню в демку используются клипплэйны когда рендерятся сплиты, может в них проблема.
>я давно отказался от такого метода.
конечно побывал выводить - они верные. т.е. дальний сплит худшего качества. куски сцены визуально рендерятся в нужные сплиты.
там не используются ClipPlane. Вместо их насколько я понимаю используется CropMatrix - которая урезает LightProj впритык к текущему сплиту.
>бери центр AABB сплита и по направлению источника сдвигай на какую то дистанцию.
>lightPos = bound.center() - lightDir * distance.
ага учту вот это.
Facepalm
и что это значит?
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 16 фев. 2009 | 18:05 | #10 |
---|
>далее углы в лайтспейс
это делается в функции CalculateLightForFrustum >чтобы как раз тебе и найти ширину и высоту твоей ортопроекционной матрицы.
случайно не по общему AABB найденных объектов?
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 16 фев. 2009 | 14:06 | #9 |
---|
>как считается RenderBase::GetShadowLightViewMatrix() ?
пересчет идет если только камера сдвинулась. Источник как бы виртуальный(Он привязан к камере) что-бы не хватать ограниченное число объектов, а не все что есть на сцене.
Т.е. сделана некая оптимизация. >тут же направленный источник света?
да.
>сейчас пока вижу что ты просто береш угы сплита фрустума камеры, и вроде как по ним строишь видовую и проекционную матрицы,
Frustum считается по рас читанной проекционной матрице для split и lightView:
вот тут ищется:
// обход SG и поиск объектов root->FindShadowCasterObjects(frustum, shadowCasterObjects[i]);
а вот это не ищу. задаю из файла константами. так же как для обычных теней.
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 16 фев. 2009 | 10:57 | #7 |
---|
>вообще это не правильно, кастер может быть и не видим камерой, а тень от него прекрасно попадает в камеру.
>правильно будет построить light furstum по куску view frustum. или возможно я тебя не так понял.
>в алгоритме проблем нет. привиди код по которому строишь light frustum.
Так и делается light furstum по куску view frustum.
for(int i = 0; i < numSplits; ++i) { const float fScale = 1.1f; // Calculate corner points of frustum split // // To avoid edge problems, scale the frustum so // that it's at least a few pixels larger // CalculateFrustumCorners(points, zNear, zFar, camera, aspect, 1.1f); // Calculate light Projection Matrix CalculateLightForFrustum(points, camera.GetViewMatrix(), camera.GetProjectionMatrix(), i); } |
(zNear, zFar берется из текущего split)
// Computes corner points of a frustum INLINE void ParallelSplitShadowMap::CalculateFrustumCorners(Math3D::Vector3D* Points, float zNear, float zFar, const Camera& camera, float Aspect, float Scale) { const Vector3D& Right = camera.GetRight(); const Vector3D& Source = camera.GetPosition(); const Vector3D& Dir = camera.GetDirection(); const Vector3D& Up = camera.GetUp(); float TanFov = tanf(degrad * camera.GetFov() * 0.5f); float NearPlaneHeight = TanFov * zNear; float NearPlaneWidth = NearPlaneHeight * Aspect; float FarPlaneHeight = TanFov * zFar; float FarPlaneWidth = FarPlaneHeight * Aspect; Vector3D vNearPlaneCenter = Source + Dir * zNear; Vector3D vFarPlaneCenter = Source + Dir * zFar; Vector3D RightNear = Right * NearPlaneWidth; Vector3D RightFar = Right * FarPlaneWidth; Vector3D UpFar = Up * FarPlaneHeight; Vector3D UpNear = Up * NearPlaneHeight; Points[0] = Vector3D(vNearPlaneCenter - RightNear - UpNear); Points[1] = Vector3D(vNearPlaneCenter - RightNear + UpNear); Points[2] = Vector3D(vNearPlaneCenter + RightNear + UpNear); Points[3] = Vector3D(vNearPlaneCenter + RightNear - UpNear); Points[4] = Vector3D(vFarPlaneCenter - RightFar - UpFar); Points[5] = Vector3D(vFarPlaneCenter - RightFar + UpFar); Points[6] = Vector3D(vFarPlaneCenter + RightFar + UpFar); Points[7] = Vector3D(vFarPlaneCenter + RightFar - UpFar); // calculate center of points Vector3D Center(0.0f, 0.0f, 0.0f); for(int i = 0; i < 8; ++i) { Center += Points[i]; } Center /= 8; // for each point for(int i = 0; i < 8; ++i) { // scale by adding offset from center Points[i] += (Points[i] - Center) * (Scale - 1.0f); } } |
// Calculates the view and projection matrix for a light. The projection // matrix is "zoomed in" on the given frustum split. void ParallelSplitShadowMap::CalculateLightForFrustum(Math3D::Vector3D* pCorners, const Math3D::Matrix4x4& CameraView, const Math3D::Matrix4x4& CascadeCameraProj, int split) { // Далее эта матрица будет передана рендеру для текущего split Matrix4x4& lightProj = Splits[split].LightProj; // lightView - видовая матрица иточника света расчитывется как обычный LookAt. const Matrix4x4& lightView = RenderBase::GetShadowLightViewMatrix(); // ViewWidth, ViewHeight - ширина и высота видимого объема - параметры ортографической матрицы, берется из настроек. CalculateProj(lightProj, lightNear, lightFarMax, ViewWidth, ViewHeight); // Next we will find the min and max values of the current // frustum split in lights post-projection space // (where coordinate range is from -1.0 to 1.0) // float MaxX = -FLT_MAX; float MaxY = -FLT_MAX; float MinX = FLT_MAX; float MinY = FLT_MAX; float MaxZ = 0; Matrix4x4 mLightViewProj = lightProj * lightView; // for each corner point for(int i = 0; i < 8; ++i) { // transform point Vector4D vTransformed = Vector4D(pCorners[i].x, pCorners[i].y, pCorners[i].z, 1.0f) * mLightViewProj; // project x and y vTransformed.x /= vTransformed.w; vTransformed.y /= vTransformed.w; MinX = std::min(MinX, vTransformed.x); MinY = std::min(MinY, vTransformed.y); MaxX = std::max(MaxX, vTransformed.x); MaxY = std::max(MaxY, vTransformed.y); MaxZ = std::max(MaxZ, vTransformed.z); } // Adjust the far plane of the light to be at the farthest // point of the frustum split. Some bias may be necessary. // lightFar = MaxZ * (lightFarMax - lightNear) + lightNear + 1.5f; // re-calculate lights matrices with the new far plane CalculateProj(lightProj, lightNear, lightFar, shadowMapDescription.ViewWidth, shadowMapDescription.ViewHeight); // Next we build a special matrix for cropping the lights view // to only contain points of the current frustum split // assert(MaxX != MinX && "Attention"); assert(MaxY != MinY && "Attention"); float ScaleY = MaxY != MinY ? 2.0f / (MaxY - MinY) : 1.0f; float ScaleX = MaxX != MinX ? 2.0f / (MaxX - MinX) : 1.0f; float OffsetX = -0.5f * (MaxX + MinX) * ScaleX; float OffsetY = - 0.5f * (MaxY + MinY) * ScaleY; Matrix4x4 CropView(ScaleX, 0.0f, 0.0f, OffsetX, 0.0f, ScaleY, 0.0f, OffsetY, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); lightProj = CropView * lightProj; } |
По сути я адаптировал и изменил реализацию из демки под сцену с объектами (в демке была простейшая реализация с 1 мешем).
Ну и поменял перспективную матрицу источника света на орто графическую.
Да сразу скажу обычные тени (Standart Shadow Map) работают корректно. Причем по такой-же схеме. Тень не исчезает.
даже если не виден объект а видна тень. Разница в том что не бьется Frustum.
Если нужно рассказать еще что-то то я готов.
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 15 фев. 2009 | 14:52 | #4 |
---|
угу
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 15 фев. 2009 | 11:47 | #2 |
---|
Нет не выходим.
В реализации предполагается вот что.
void ParallelSplitShadowMap::SetNumSplits(int num) { ... Splits.resize(num + 1); ... CalculateSplitDistances(camera.GetzNear(), camera.GetzFar()); }
void ParallelSplitShadowMap::CalculateSplitDistances(float CameraNear, float CameraFar) { ... Splits[numSplits].SplitDistance = CameraFar; ... } |
Parallel Split Shadow Map: Проблемы с глубиной.(Закрыто) | 15 фев. 2009 | 2:13 | #0 |
---|
Делал опираясь на общеизвестную демку http://hax.fi/asko/PSSM.html .
Тень получилась четкая.
Возникала проблема c глубиной на последнем разбиении.
Скриншот описывают проблему.
http://img183.imageshack.us/my.php?image=screenshot2tw2.jpg
Сразу скажу прошу за качество картинки не пинать там еще работы непочатый край.
Опишу расширенную реализацию опирающуюся на демку.
Для каждого разбиения есть свой список видимых объектов и список объектов попавших в тень.
Для ландшафта аналогично сделаны несколько списков листьев для каждого разбиения.
Разбиения рассчитаны по логарифмической схеме(http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_vrcia/keypoint1.htm)
Реализация такова:
1) Для каждого разбиения, ищется список объектов в тень. Заодно тут -же расчитывается
проекционная матрица источника света(по ней строится frustum для поиска) и сохраняется для дальнейшей передачи рендеру;
2) Для каждого разбиения ищется список объектов и список листьев дерева ландшафта, видимых камерой
Заодно тут -же рассчитывается проекционная матрица камеры.
3) При отсрисовке для каждого разбиения
рендерим в текстуру тени свой список объектов используя, уже готовую матрицу источника света(рассчитанную ранее при поиске).
4) Выставляем ViewPort. Используем матрицу камеры для текущего разбиения(рассчитанную при поиске) рисуем список объектов для
этого разбиения и список листьев дерева ландшафта.
Приведу несложные куски кода.(Убраны детали не нужные для описания проблемы)
Поиск видимых объектов и объектов для тени.
for(int i = 0; i < numSplits; ++i) { float zNear = Splits[i].SplitDistance; float zFar = Splits[i + 1].SplitDistance; camera.SetzNear(zNear); camera.SetzFar(zFar); .. // считаем Frustum камеры для i-разбиения .. // find Visible objects root->FindVisibleObjects(camera, visibleObjects[i]); // найти список листьев Octree для i разбиения octree.Update(i); ... // считаем Frustum источника света для i-разбиения ... // обход SG и поиск объектов root->FindShadowCasterObjects(frustum, shadowCasterObjects[i]); }
Что я делаю не так? Спасибо всем заранее.
С Уважением Андрей.
Правка: 7 мар. 2009 15:13
PSSM vs CSM | 15 фев. 2009 | 1:56 | #3 |
---|