Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 20:33   #1
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию XNA & HLSL

Всем добрый вечер.

Прошу помочь разобраться в одном деле:
Как через матрицу проекции двигать элемент.

У меня сделано счас вот так:
Установка параметров для шейдера (прокоментировал действия):
Код:
 
Matrix temp = Matrix.Identity;
            float widthScreen = (float)game.GraphicsDevice.Viewport.Width; //Ширина экрана
            float heightScreen = (float)game.GraphicsDevice.Viewport.Height; // Его высота
            // Так как в размер экрана шейдера от -1 до 1, высчитываем соотвествено.
            float widthscale = 1 / widthScreen;  
            float heightscale = 1 / heightScreen;
            // Сужение/растяжение по горизонтали
            temp.M11 = widthscale * size.X;
            // по вертикали
            temp.M22 = heightscale * size.Y;
            Fire.Parameters["xWorldViewProjection"].SetValue(temp);
            Fire.Parameters["x"].SetValue(SwapX(position.X));
            Fire.Parameters["y"].SetValue(SwapY(position.Y));
Функции перевода координат
Код:
float SwapX(float value)
        {
            float widthScreen = (float)game.GraphicsDevice.Viewport.Width;
            return value / widthScreen * 2 - 1;

        }
        float SwapY(float value)
        {
            float widthScreen = (float)game.GraphicsDevice.Viewport.Height; 
            return -value / widthScreen * 2 + 1;
        }
Рисование объекта
Код:
  graphics.GraphicsDevice.BlendState = BlendState.NonPremultiplied;

            VertexPositionColor[] vertexList;
            // описание формата вершин
            VertexDeclaration vertexDeclaration;
            // создать массив-контейнер для хранения трёх вершин
            vertexList = new VertexPositionColor[6];
            // создать в массиве вершин два треугольника(квадрат) типа VertexPositionColor
            vertexList[0] = new VertexPositionColor(new Vector3(-1,-1, 0), Color.White);
            vertexList[1] = new VertexPositionColor(new Vector3(-1, 1, 0), Color.White);
            vertexList[2] = new VertexPositionColor(new Vector3(1, -1, 0), Color.White);
            vertexList[3] = new VertexPositionColor(new Vector3(1, 1, 0), Color.White);
            vertexList[4] = new VertexPositionColor(new Vector3(1, -1, 0), Color.White);
            vertexList[5] = new VertexPositionColor(new Vector3(-1,1, 0), Color.White);

            // создать описание формата вершин
            vertexDeclaration = new VertexDeclaration(VertexPositionTexture.VertexDeclaration.GetVertexElements());

            Fire.CurrentTechnique.Passes[0].Apply();

            // нарисовать
            graphics.GraphicsDevice.DrawUserPrimitives<VertexPositionColor>
            (PrimitiveType.TriangleList, vertexList, 0, 2);
И самое важное, Вершинный шейдер
Код:
Out.Pos = mul(input.Pos, xWorldViewProjection);
   Out.Pos.x += x;
   Out.Pos.y += y;
   Out.pos = input.Pos.xy;
Вопрос, как сделать через одну матрицу, а не отдельно высчитывать как это у меня. Потому что мне кажется это не правильно

P.S. Высчитывает правильно
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Старый 24.10.2012, 22:09   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Что-то не понял, а почему бы на матрицу сдвига (MatrixTranslate) просто не домножать? Вроде как, Вы то же самое делаете (как я могу по коду и комментам понять), но делаете через вектор, который загоняете и меняете в шейдере...

Не знаю, как в ХНЕ, да и с шейдерами на Вы пока что ещё, но я матрицы руками все обрабатываю. Объект содержит свои данные, при рендеринге он получает матрицу из сцены (обычно для учета настроек камеры), пушит её, и домножает/устанавливает её на нужные матрицы , согласно своим настройкам - для поворота, сдвига и прочая, рисуется, а потом попает матрицу.
Приведу код, правда, непонятный может(дельфи и движок DGLE), но Вы чисто по англ. языку ориентируйтесь. Единственное, что надо пояснить, это setmatrix - устанавливает или умножает (параметром-флагом в конце регулируется, тру - умножить) текущую матрицу ( это шаг "получает" и "устанавливает" вместе из описания выше) на ту что в параметре.
Код:
 //Draw meshes
  pRender3D.PushStates(PSF_ALL);
  pRender3D.ToggleAlphaTest(True);

  // set position and texture for first tree
  pRender3D.SetMatrix(MatrixMul(MatrixTranslate(Point3(0.25, -0.25, 0.0)),
    MatrixRotate(-90.0, Point3(1.0, 0.0, 0.0))), true); // rotate to vertical
  
  pTex1.Bind();
  pTree1.Draw();
  // and for second
  pRender3D.SetMatrix(MatrixTranslate(Point3(-0.75, 0.25, 0.0)), True);
  pTex2.Bind();
  pTree2.Draw();
  // and third
  pRender3D.SetMatrix(MatrixTranslate(Point3(-0.75, 0.25, 0.0)), True);
  pTex3.Bind();
  pTree3.Draw();
  //tower
  pRender3D.SetMatrix(MatrixTranslate(Point3(-0.75, 0.25, 0.5)), True);
  pTexStones.Bind();
  pMeshTower.Draw();

  pRender3D.PopStates();
В коде цифири (0,25 0,75 и т.п.) по идее заменяются на свойства объекта (размещение), просто этот кусок не доработан на объектную модель, но так нагляднее даже, а то там просто бы цикл вызовов методов объектов был бы.

Теория на всякий случай http://habrahabr.ru/post/131931/

Последний раз редактировалось phomm; 24.10.2012 в 22:15.
phomm вне форума Ответить с цитированием
Старый 26.10.2012, 11:14   #3
Inv1s
Форумчанин
 
Аватар для Inv1s
 
Регистрация: 06.11.2011
Сообщений: 214
По умолчанию

Если я правильно разобрал код и сообщение, то если перемножить еденичиную матрицу на матрицу в которой будет перемещение то должен быть сдвиг?

Счас попробую)

Теория классная, давно читал про нее, забыл про ее существование
Помог, нажми на весы
html, js, php, С++, С#, OpenGl, DirectX, XNA, HLSL
Inv1s вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шейдеры (HLSL) и OpenGL ImmortalAlexSan Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.04.2012 18:54
direct3d9 HLSL shader и AABB ivan-b Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 26.08.2011 13:20
DirectX HLSL Текстурирование Celestia Мультимедиа в Delphi 1 03.02.2011 08:59
BitmapEffects -> HLSL, Shaders BOBAH13 Общие вопросы .NET 0 31.10.2010 23:23