Как программно отразить спрайт в DirectХ?
P.S. Отразить - всмысле как в зеркале, или то что в фотошопе зовется canvas->flip horizontal
Оставьте и мне покурить!!
Texture reflect(Texture)
return myReflectShader(Texture);
}
А не подскажите тогда, где такой шейдер можно достать?
И неужели нет стандартной функции в DirectX, чтоб спрайт отразить?
Texture reflect(Texture)
return myReflectShader(Texture);
}
А не подскажите тогда, где такой шейдер можно достать?
И неужели нет стандартной функции в DirectX, чтоб спрайт отразить?
Про шейдеры читать тут: http://www.gamedev.ru/terms/Shader.
ЗЫ Я лично никогда не юзал освещение, текстуры и др., что предлагается в DX с готовым решением, поскольку это готовое решение не отражает моих потребностей в эффектах. Проще написать шейдер, в котором всё это предусмотрено и можно делать всё, что подсказывает моё больное воображение.:D
Как программно отразить спрайт в DirectХ?
ЗЫЫ Лучше не программно, а аппаратно. Так быстрее.;)
К топиккастеру - а мы не ясновидящие, вы бв свой код показали, что-ли.
абсолютно обычный код для спрайтов в C#:
вроде такого:
device.BeginScene();
device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
sprite.Begin(SpriteFlags.AlphaBlend);
// my magic Y-axe reflect transform
sprite.Draw(texture, Vector3.Empty, new Vector3(0,
spriteY, 0),
Color.White.ToArgb());
sprite.End();
device.EndScene();
device.Present();
...
а нужно чтоб команда sprite.Draw(...) рисовала уже отраженный спрайт
(например если на картинке "-->" то отрзится "<--")
я пробовал что то типа:
sprite1.Transform = sprite.Transform.reflect(...)
...
К топиккастеру - а мы не ясновидящие, вы бв свой код показали, что-ли.
А я знаю, что такое спрайт. Как раз шейдерами и лучше всего их отрисовывать и забыть про фиксированный конвейер. Я лично не долго думал, какими шейдерами пользоваться, т.к. текстура (её самплер кидается в соответствующий регистр) доступна именно для пиксельных шейдеров.
Речь идёт об изменениях координат текстуры (отражение). А это в пиксельных шейдерах достигается добавлением 1 арифметической операции.
А если нужно отражение от к-л предмета как от зеркала, то добавляем ещё 1 объект-отражение. Немного корректируем его координаты и накладываем на него ту же текстуру с изменёнными текстурными координатами.
Вам сюда: http://ru.wikipedia.org/wiki/Шейдер
Особенно внимательно читайте определение, не упустите из виду фразу - "в трехмерной графике", прочитайте начало топика, вдумайтесь в слова "2д файтинг". Если это для вас - не убедительно - то советую в приведенной вами же ссылке - перейти к статье подробно описывающей шейдеры, а не ограничиться кратким описанием. Приведу оттуда цитату:
Пиксельные шейдеры выполняются для каждого фрагмента в фазе растеризации треугольников. Фрагмент (или пиксель) — точка, с оконными координатами, полученная растеризатором после выполнения над ней ряда операций. Проще говоря, результирующая точка буфере кадра, совокупность этих точек потом формирует изображение. Пиксельные шейдеры оперирует над фрагментами до заключительных стадий, т.е. до тестов глубины, альфы и stencil. Кстати, возможно в будущем и этими операциями будет управлять шейдер, кто знает… Пиксельный шейдер получает интерполированные данные (цвет, текстурные координаты) из вершинного шейдера.
Итак, для 2д задачи вы предлагаете - перейти от 2д к 3д,утверждая, что это более легкий способ решения задачи. А еще возникает вопрос, а вы знаете какой версией DirectX пользуется топиккастер? Потому-что, если мне не изменяет память до версии 8.0 DirectDraw был отдельной частью DirectX, и автор может пользоваться именно средствами DirectDraw, а не Direct3D.
Топик-кастеру лучше всего заглянуть сюда:
http://msdn2.microsoft.com/en-us/library/bb194906.aspx
Т.е. обычный спрайт:
(0,0) (1,0)
(0,1) (1,1)
перевернутый:
(1,0) (0,0)
(1,1) (0,1)
Только там ни слова про отражение и ХNA использует свои классы спрайтов, отличные от обычных директ Икс спрайтов=(
Здорово. А как указать текстурные координаты спрайту?
Отнюдь. В восьмой версии DD как интерфейс уже непрочь прекратил своё существование, а в седьмой версии D3D являлся логической надстройкой над DD и работал в тесном с ним взаимодействии.
Автор, как насчёт Microsoft.DirectX.Direct3D.Sprite.Transform? Типа, повернуть на 180 и всё такое?
Автор, как насчёт Microsoft.DirectX.Direct3D.Sprite.Transform? Типа, повернуть на 180 и всё такое?
Читайте внимательней, мои посты. Там есть магические слова. Например, слово "до". Во вторых, D3D не работал с DD в "тесном взаимодействии". Можно было спокойно создать приложение использующее DD, и не используещее, D3D. Да и что вы пытаетесь доказать? Что использование 3д в двумерных играх хорошо? И нагружать гпу шейдерами для 2д тоже круто? А как же аудитория, на которую расчитан продукт, они обязаны для 2д игры покупать мощные 3д ускорители, только потому, что у кого-то зацикленность на новых технологиях? Та они пошлют лесом вас с вашим продуктом, с таким подходом.