Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectX 4-мерная визуализация, стопка текстур "бутербродом" 
V
    Опции темы
marcusmae
Дата 16.4.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Всем привет.

Под четырёхмерной визуализацией я понимаю визуализацию функции трёх переменных f(x,y,z), в которой  переменные откладываются по трём осям, а цвет служит индикатором того или иного значения функции (в лит-ре - volume visualization). Имею замысел сделать небольшую программку, скорее всего с использованием DirectX, которая могла бы это делать. Сразу скажу, что по четырёхмерке в сети очень мало наработок, имеющиеся - старые и закрытые, так что надо думать самому. Так что, если то, что я опишу далее, неосуществимо или можно сделать лучше - так и скажите, плз.

Положим, у меня имелись таблицы значений f(x,y,z), из которых я уже наштамповал стопку изображений с альфа-каналом. Каждое из этих изображений является срезом будующей визуализации по высоте, то есть, разместив их друг под другом, я получу желанный слоёный пирог. Проблема шага между слоями, в принципе, не стоит, поскольку промежуточные изображения можно сгенерить, воспользовавшись, например, интерполяционными полиномами. 

В чём же вопрос? = Затруднение вызывает вывод двухсторонних, полупрозрачных текстур (этих самых изображений) друг над другом с весьма малым шагом. Может быть, угостите советом/ссылкой или куском кода под DirectX?

ЗЫ: Пишу в раздел C#, однако готов разобраться и в плюсах.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 17.4.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Пример на XNA подойдёт ?


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 17.4.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(mr.DUDA @ 17.4.2007,  10:22)
Пример на XNA подойдёт ?

Да, подойдёт.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 17.4.2007, 18:59 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Ok, только сразу предупреждаю не пугаться если с шейдерами не знаком smile

Исходник:
Код
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
        }


        Texture3D _texture;
        Effect _effect;
        VertexDeclaration _vertexFormat;
        VertexBuffer _vertexBuffer;

        protected override void LoadGraphicsContent(bool loadAllContent)
        {
            GraphicsDevice device = this.graphics.GraphicsDevice;

            // текстура
            _texture = Texture3D.FromFile(device, @"c:\NoiseVolume.dds");

            // шейдер
            CompiledEffect c_effect = Effect.CompileEffectFromFile(@"c:\my_shader.fx", null, null, CompilerOptions.None, TargetPlatform.Windows);
            _effect = new Effect(device, c_effect.GetEffectCode(), CompilerOptions.None, null);

            // вершины (будем рисовать квадрат из 2х треугольников)
            _vertexFormat = new VertexDeclaration(device, VertexPositionTexture.VertexElements);
            _vertexBuffer = new VertexBuffer(device, typeof(VertexPositionTexture), 6, ResourceUsage.WriteOnly);
            _vertexBuffer.SetData(new VertexPositionTexture[]
            {
                new VertexPositionTexture(new Vector3(-1f, -1f, 0), new Vector2(0, 0)),
                new VertexPositionTexture(new Vector3(0.75f, -1f, 0), new Vector2(1f, 0)),
                new VertexPositionTexture(new Vector3(-0.75f, 1f, 0), new Vector2(0, 1f)),
                new VertexPositionTexture(new Vector3(0.75f, -1f, 0), new Vector2(1f, 0)),
                new VertexPositionTexture(new Vector3(1f, 1f, 0), new Vector2(1f, 1f)),
                new VertexPositionTexture(new Vector3(-0.75f, 1f, 0), new Vector2(0, 1f))
            });
        }


        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice device = this.graphics.GraphicsDevice;
            device.Clear(Color.Black);

            // назначаем режимы рендеринга (render states)
            device.RenderState.DepthBufferEnable = false;
            device.RenderState.CullMode = CullMode.None;
            device.RenderState.AlphaBlendEnable = true;
            device.RenderState.SourceBlend = Blend.SourceAlpha;
            device.RenderState.DestinationBlend = Blend.InverseSourceAlpha;

            // назначаем вершинный буфер
            device.Vertices[0].SetSource(_vertexBuffer, 0, VertexPositionTexture.SizeInBytes);
            device.VertexDeclaration = _vertexFormat;

            // назначаем текстуру
            device.Textures[0] = _texture;

            // техника у нас одна
            _effect.CurrentTechnique = _effect.Techniques[0];
            float numLayers = (float)_texture.Depth;

            // проходим по каналам 3D-текстуры
            for (float iLayer = 0; iLayer < numLayers; iLayer++)
            {
                // определяем параметры эффекта
                _effect.Parameters["layerHeight"].SetValue(16f / numLayers);
                _effect.Parameters["layerY"].SetValue(1f - 2f * iLayer / numLayers);
                _effect.Parameters["layerIndex0to1"].SetValue(iLayer / numLayers);

                // рисуем квадрат с прозрачностью
                _effect.Begin();
                _effect.CurrentTechnique.Passes[0].Begin();
                device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);
                _effect.CurrentTechnique.Passes[0].End();
                _effect.End();
            }

            base.Draw(gameTime);
        }
    }
}


my_shader.fx
Код
uniform sampler3D Tex;

// параметры для вертексного шейдера
uniform float layerHeight;
uniform float layerY;

// параметры для пиксельного шейдера
uniform float layerIndex0to1;


void vs_main
(
    float4 pos : POSITION,
    float2 texCoord : TEXCOORD,
    
    out float4 oPos : POSITION,
    out float2 oTexCoord : TEXCOORD
)
{
    // координаты вершин - сдвигаем и масштабируем Y чтобы показать слои друг над другом в перспективе
    oPos = pos;
    oPos.y = oPos.y * layerHeight + layerY;

    // координаты в волюметрической текстуре
    oTexCoord = texCoord;
}


float4 ps_main(float2 texCoords: TEXCOORD0) : COLOR
{
    // составляем 3-мерные текстурные координаты из 2-мерных и номера слоя (0..1)
    float3 texCoords3D = float3(texCoords, layerIndex0to1);

    // получаем цвет пиксела
    return tex3D(Tex, texCoords3D);
}


technique SimpleTexturing
{
    pass p0
    {
        vertexshader = compile vs_2_0 vs_main();
        pixelshader = compile ps_2_0 ps_main(); 
    }
}


Трехмерная текстура может быть любая. Шейдер и текстуру можно положить в любую директорию, только пути подправить в коде.

Отрисованный результат можно забрать из бэкбуфера в текстуру (device.ResolveBackBuffer) и к примеру сохранить в файл.

Это сообщение отредактировал(а) mr.DUDA - 18.4.2007, 09:37


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 17.4.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(mr.DUDA @  17.4.2007,  18:59 Найти цитируемый пост)
только сразу предупреждаю не пугаться если с шейдерами не знаком 

Не знаком. Не пугаюсь, наборот, оч любопытно.

С XNA ранее не работал, но сейчас поставлю и буду обучаться (кажется, это того стоит).  smile

Большое спасибо за подробный пример!  smile 



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
mr.DUDA
Дата 18.4.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Я отредактировал предыдущий пост, добавил перспективу (см. скрин).  В первом варианте слои "склеивались" в один квадрат повёрнутый к наблюдателю. На скрине - шумовая текстура без прозрачности (других не было). Можно поиграться с настройкой параметров (строки 78 и 79), чтобы все слои "бутерброда" были видны.

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  shot.jpg 57,22 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Lеstat
Дата 19.4.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

Репутация: нет
Всего: нет



Не подскажете как можно выводить то, что рисует XNA на свою форму?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 19.4.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Lеstat @  19.4.2007,  18:50 Найти цитируемый пост)
Не подскажете как можно выводить то, что рисует XNA на свою форму?

Это второй вопрос smile
С ходу не отвечу, но видимо достаточно выполнить GraphicsDevice.Reset передав туда PresentationParameters с указанием собственного контрола в DeviceWindowHandle.


--------------------
user posted image
PM MAIL WWW   Вверх
Kvazilol
Дата 20.4.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



прошу прощения, а как понормальному поставить XNA ? у меня оно пишет что требуется VisualStudio Express но я не собираюсь сносить Final и ставить это убожесто 
PM MAIL   Вверх
Lеstat
Дата 20.4.2007, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 28.12.2005
Где: Москва

Репутация: нет
Всего: нет



покапался и вот что нашел...  интересные статейки
XNA - WinForms
Using XNA with WinForms
"сам шучу, сам смеюсь" ©  smile 

а вот на тему как поставить без экспресса... так бегло просморел
Поставил XNA Studio без C# Express
Проблемы с работой XNA
XNA на MSVS2005Pro

Это сообщение отредактировал(а) Lеstat - 20.4.2007, 02:42
PM MAIL ICQ   Вверх
mr.DUDA
Дата 20.4.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Kvazilol
Модератор: Пожалуйста, один топик - один вопрос.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.