Пиксельный шейдер для спрайтов в Managed DX

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Ivan76rus
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 27.01.2013 (Вс) 18:12

Пиксельный шейдер для спрайтов в Managed DX

Сообщение Ivan76rus » 27.01.2013 (Вс) 18:22

Здравствуйте! Помогите пожалуйста решить проблему, я перевожу программу с XNA на Managed DX, но вот с пиксельным шейдером возникла проблема, он отказывается работать со спрайтами. Что я не так делаю? Ошибок при компиляции и в процессе работы не возникает.

Вот есть код:

Код: Выделить всё
Public Render As New Tasks.Task(AddressOf _Render)

    Dim textur, render_tex As Texture

    Dim sprite As Sprite
    Dim effectx As Effect
    Dim sur As Surface

    Public Sub InitDX3D(ByVal Width As Integer, ByVal Heigth As Integer, ByVal FullScreen As Boolean, Form As IntPtr)
        Try
            deviceSetting.BackBufferCount = 2 'количество буферов
            deviceSetting.DeviceWindowHandle = Form 'дескриптор окна для которого создается устройство
            deviceSetting.SwapEffect = SwapEffect.Discard 'параметры перерисовки изображения
            deviceSetting.PresentationInterval = PresentInterval.Default 'интервал смены буферов

            If FullScreen = False Then
                deviceSetting.Windowed = True
            Else
                deviceSetting.Windowed = False
                deviceSetting.BackBufferWidth = Width 'горизонтальное разрешение экрана
                deviceSetting.BackBufferHeight = Heigth 'вертикальное разрешение экранаn
                deviceSetting.BackBufferFormat = Format.A8R8G8B8 'буферы имеют формат 32-bit
            End If
        Catch ex As Exception
            Add(ex.Message)
        End Try

        Try
            device = New Direct3D.Device(0, Direct3D.DeviceType.Hardware, Form, CreateFlags.HardwareVertexProcessing, deviceSetting)
        Catch ex As Exception
            Add(ex.Message)
        End Try

    End Sub

    Public Function LoadTexture(ByVal file As String, Optional ByVal Format As Direct3D.Format = Direct3D.Format.A8R8G8B8) As Texture
        Try
            Return TextureLoader.FromFile(device, file, 0, 0, 0, Usage.None, Format, Pool.Managed, Filter.None, Filter.Linear, Nothing)
        Catch ex As Exception
            Add("Ошибка загрузки текстуры: " & "\texture\" & file)
            Return TextureLoader.FromFile(device, "\texture\error.jpg", 0, 0, 0, Usage.None, Format, Pool.Managed, Filter.None, Filter.Linear, Nothing)
        End Try
    End Function

    Public Sub Load()
        sprite = New Sprite(device)
        textur = LoadTexture("C:\Users\Иван\Documents\Visual Studio 2012\Projects\Next Time\Next Time\bin\Release\texture\tex2.png")
        Dim fstr As String = ""
        effectx = Effect.FromFile(device, "D:\convert1.fx", Nothing, Nothing, ShaderFlags.NotCloneable, Nothing, fstr)
        If fstr <> "" Then Add(fstr)
        effectx.ValidateTechnique("BAW")
        effectx.Technique = "BAW"
    End Sub

    Private Sub _Render()
         While 1
            Try
                With device
                    .Clear(ClearFlags.Target, 100, 0, 0)
                    .BeginScene()
                    effectx.Begin(FX.None)
                    effectx.BeginPass(0)
                    With sprite
                        x -= 0.001
                        .Begin(SpriteFlags.AlphaBlend)
                        .Transform = Matrix.Transformation2D(ZeroV2, 0, New Vector2(1, 1), ZeroV2, 0, ZeroV2)
                        .Draw(textur, ZeroV3, ZeroV3, System.Drawing.Color.White.ToArgb)
                        .End()
                    End With
                    effectx.EndPass()
                    effectx.End()
                    .EndScene()
                    .Present()
                End With
            Catch ex As Exception
                Add(ex.Message)
                Exit While
            End Try
        End While
    End Sub


А вот код шейдера:

Код: Выделить всё
sampler Texture0;
float4 ps_main(float4 color:TEXCOORD) : COLOR
{
        return float4(1.0,1.0,1.0,1.0);
}

technique BAW
{
    pass Pass1
    {
        PixelShader = compile ps_2_0 ps_main();
    }
}


Это просто проверочный вариант, возвращающий белый цвет.

Я думаю, что не работает по тому что в шейдер не передается текстура, на XNA использовались методы SetRenderTarget. Как на MDX можно рендерить в текстуру и передать ее в шейдер?

Вот код на XNA:

Код: Выделить всё
BackTexture = Resource.Content.Load(Of Texture2D)("Map\\" & Name & "\back")
            BackState = New RenderTarget2D(graphics.GraphicsDevice, Settings.Resolution.X, Settings.Resolution.Y)

            graphics.GraphicsDevice.SetRenderTarget(BackState)
            graphics.GraphicsDevice.Clear(Color.Black)
            spriteBatch.Begin(0, BlendState.Opaque, Nothing, Nothing, Nothing, Effect)
            spriteBatch.Draw(BackTexture, Vector2.Zero, BackColor)
            spriteBatch.End()
            graphics.GraphicsDevice.SetRenderTarget(Nothing)


Помогите пожалуйста!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Пиксельный шейдер для спрайтов в Managed DX

Сообщение Mikle » 27.01.2013 (Вс) 18:45

Я тебе уже ответил на этот вопрос в другом форуме:
http://www.gamedev.ru/code/forum/?id=172140
Ты, видимо, ждёшь, пока кто-нибудь сделает за тебя всё?

Ivan76rus
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 27.01.2013 (Вс) 18:12

Re: Пиксельный шейдер для спрайтов в Managed DX

Сообщение Ivan76rus » 27.01.2013 (Вс) 19:46

Там не все так просто, с SetRenderTarget я разобрался, сделал рендер в текстуру, все равно не работает, видимо со спрайтами не работают пиксельные шейдеры!
У меня ничего не работает, я даже готов заплатить за работающий пример!


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 8

    TopList