Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка изображений с помощью шейдеров, DirectX + C# + Pixel Shaders 
:(
    Опции темы
Vit_as
Дата 16.4.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поставлена задача написания фильтров для обработки изображений в реальном времени (изображение 1000*1000 должно фильтроваться < 50 мс)
Было решено использовать для этого дела GPU. Само приложение должно быть написано  на .NET (C# в основном) 

Написал приложение на C# которое с помощью DirectX обращается к шейдеру. Написал простой шейдер который должен изменять яркость картинки:
Код

texture2D tex0;

float brightness;

sampler2D texSampler = sampler_state
{
    Texture = <tex0>;
};

struct PixelInput
{
    float2 texcoord : TEXCOORD0;
};

float4 MainPS(PixelInput input):COLOR
{
    return  tex2D(texSampler, input.texcoord)*brightness;
}

technique Texturing
{
    pass p0
    {
        PixelShader = compile ps_2_0 MainPS();
    }
}



В результате получаю изображение в виде одноцветного  ( цвет пикселя изображения с координатами (0,0)) прямоугольника.
Вопрос в том как сделать так, чтобы координаты input.texcoord менялись.
И если можно то киньте пожалуйста примеры или ссылки.
PM MAIL   Вверх
mr.DUDA
Дата 16.4.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А вертексный шейдер где? Примеры, как работать с XNA, на xnadev.ru и creators.xnaclub.com есть. Если нужен Managed DirectX, велкам на The Z-Buffer .com


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


Новичок



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

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



Нужен именно Managed DirectX. На www.thezbuffer.com ничего по обработки 2D графики не нашел.
PM MAIL   Вверх
Vit_as
Дата 17.4.2008, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообще код самого приложения выглядит следующим образом:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX;


namespace WindowsShader
{
    public partial class Form1 : Form
    {
        private Effect effect = null;
        PresentParameters presentParams;
        Texture texture;
        Microsoft.DirectX.Direct3D.CustomVertex.PositionColored[] vertex;
        private Device device;
        
        public Form1()
        {
            InitializeComponent();
           
            if (!InitializeGraphics())
            {
                MessageBox.Show("Your card does not support shaders. " +
                "This application will run in ref mode instead.");
            } 
        }

        public bool InitializeGraphics()
        {
            presentParams = new PresentParameters();
            presentParams.Windowed = true;
            presentParams.SwapEffect = SwapEffect.Discard;
            presentParams.AutoDepthStencilFormat = DepthFormat.D16;
            presentParams.EnableAutoDepthStencil = true;
            bool canDoShaders = true;
           
            Caps hardware = Manager.GetDeviceCaps(0, DeviceType.Hardware);
            if ((hardware.VertexShaderVersion >= new Version(1, 1)) &&
                (hardware.PixelShaderVersion >= new Version(1, 1)))
            {
                CreateFlags flags = CreateFlags.SoftwareVertexProcessing;

                if (hardware.DeviceCaps.SupportsHardwareTransformAndLight)
                    flags = CreateFlags.HardwareVertexProcessing;

                if (hardware.DeviceCaps.SupportsPureDevice)
                    flags |= CreateFlags.PureDevice;
                device = new Device(0, DeviceType.Hardware, this, flags, presentParams);
            }
            else
            {
                canDoShaders = false;

                device = new Device(0, DeviceType.Reference, this, CreateFlags.SoftwareVertexProcessing, presentParams);
            }

            vertex = new CustomVertex.PositionColored[3];
            vertex[0] = new Microsoft.DirectX.Direct3D.CustomVertex.PositionColored(-1, -1, 0.0f, int.MaxValue);
            vertex[1] = new Microsoft.DirectX.Direct3D.CustomVertex.PositionColored(-1, 1, 0.0f, int.MaxValue);
            vertex[2] = new Microsoft.DirectX.Direct3D.CustomVertex.PositionColored(1, -1, 0.0f, int.MaxValue);

            texture = Texture.FromBitmap(device, new Bitmap(@"C:\00.jpg"),Usage.SoftwareProcessing, Pool.Managed);

           

            effect = Effect.FromFile(device, @"..\..\simple.fx", null,null, ShaderFlags.None, null);
 
            device.SetTexture(0, texture);
            effect.ValidateTechnique("Texturing");
            effect.Technique = "Texturing";
            effect.SetValue("tex0", texture);
          
            effect.SetValue("brightness", 1.0f);
            return canDoShaders;
        }
     
       
        private void MainForm_Paint(object sender, PaintEventArgs e)
        {
            try
            {
                int res;
                
                device.CheckCooperativeLevel(out res); 
               
                device.RenderState.CullMode = Cull.None;

                device.VertexFormat = Microsoft.DirectX.Direct3D.CustomVertex.PositionTextured.Format;
                if ((ResultCode)res == ResultCode.DeviceLost)
                    throw new DeviceLostException();

                if ((ResultCode)res == ResultCode.DeviceNotReset)
                {
                    device.Reset(presentParams);
                }

                device.Clear(ClearFlags.Target, Color.White, 0.0f, 0);

                device.BeginScene();
                
                device.VertexFormat = Microsoft.DirectX.Direct3D.CustomVertex.PositionColored.Format;

                int passes = effect.Begin(FX.DoNotSaveSamplerState);
                for (int pass = 0; pass < passes; pass++)
                {
                    effect.BeginPass(pass);
                    device.DrawUserPrimitives(PrimitiveType.TriangleFan, vertex.Length, vertex);
                    effect.EndPass();
                }
                device.EndScene();
                device.Present();
            }
            catch (DeviceNotResetException)
            {
                Invalidate();
            }
            catch (DeviceLostException)
            {
            }
        }
    }
}



файл "simple.fx" в первом сообщении темы.

Вообще, что я не правильно делаю, если в итоге вижу форму с закрашенным одним цветом прямоугольником? 
PM MAIL   Вверх
Vit_as
  Дата 21.4.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я так понимаю, что никто этим не занимался?? smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




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


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

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