• Create Account

### #Actualboops boops

Posted 19 September 2012 - 07:36 AM

Hi everyone,
I'm making a custom control in VB.Net which provides image panning, zooming and rotation.It's working the way I like in GDI+ except that it's slow and can't deal with anything over about 4096x4096 pixels. So I decided to try rendering in DirectX instead. It's definitely zippier but there is still an upper limit on image size: now, after column/row 4095 or so, the last column/row is repeated in the render to produce stripes of colour. I gather from this thread that the upper size limit is a long known problem. I'm a bit of a dinosaur (WinXPsp3 with DX3d10, 2GB system memory, 256MB video) so I guess I am running into the same thing.

This is my first time using DirectX and I arrived at the following code by taking available examples and stripping out whatever seemed superflous.
Private Sub InitiateDevice()
Dim pParams As New PresentParameters With {.Windowed = True, .SwapEffect = SwapEffect.Discard, .BackBufferCount = 0}
_Device = New Device(0, DeviceType.Hardware, Me.Handle, CreateFlags.MixedVertexProcessing, pParams)
_Device.SetRenderState(RenderStates.AlphaBlendEnable, True)
_Device.RenderState.SourceBlend = Blend.SourceAlpha
End Sub

Private Function GetTextureFromFile(filename As String) As Texture
Return TextureLoader.FromFile(_Device, filename, _ImageSize.Width, _ImageSize.Height, 0, 0, 0, Pool.Managed, Filter.Linear, Filter.Linear, 0)
End Function

Private Sub Render()
If _Device IsNot Nothing Then
Dim srcRectangle As New Rectangle(Point.Empty, _ImageSize)
Dim destSize As New Size(CInt(_ImageSize.Width * _ZoomFactor), CInt(_ImageSize.Height * _ZoomFactor))
_Device.Clear(ClearFlags.Target, Me.BackColor, 0, 0)
_Device.BeginScene()
Using sprite As New Sprite(_Device)
sprite.Begin(SpriteFlags.AlphaBlend)
sprite.Draw2D(_Texture, srcRectangle, destSize, _
_RotationCentre, _Rotation, _ImageCentre, Color.White)
sprite.End()
End Using
_Device.EndScene()
_Device.Present()
End If
End Sub

The identifiers beginning with underscores are defined at class level. I have tried variations on arguments such as Width, Height, Pool and Filter without solving the problem. Assuming there isn't something simple I need to change, can anyone recommend a better technique for handling large images (e.g. > 10K * 10K pixels) with DirectX?

cheers, BB

EDIT: I just found a tool called DirectX Caps Viewer which reveals that my graphics card is indeed limited to a maximum texture size of 4096 * 4096. Can I overcome this limit by dividing large images into multiple textures? If so, can anyone recommend an example?

### #2boops boops

Posted 19 September 2012 - 07:20 AM

Hi everyone,
I'm making a custom control in VB.Net which provides image panning, zooming and rotation.It's working the way I like in GDI+ except that it's slow and can't deal with anything over about 4096x4096 pixels. So I decided to try rendering in DirectX instead. It's definitely zippier but there is still an upper limit on image size: now, after column/row 4095 or so, the last column/row is repeated in the render to produce stripes of colour. I gather from this thread that the upper size limit is a long known problem. I'm a bit of a dinosaur (WinXPsp3 with DX3d10, 2GB system memory, 256MB video) so I guess I am running into the same thing.

This is my first time using DirectX and I arrived at the following code by taking available examples and stripping out whatever seemed superflous.
Private Sub InitiateDevice()
Dim pParams As New PresentParameters With {.Windowed = True, .SwapEffect = SwapEffect.Discard, .BackBufferCount = 0}
_Device = New Device(0, DeviceType.Hardware, Me.Handle, CreateFlags.MixedVertexProcessing, pParams)
_Device.SetRenderState(RenderStates.AlphaBlendEnable, True)
_Device.RenderState.SourceBlend = Blend.SourceAlpha
End Sub

Private Function GetTextureFromFile(filename As String) As Texture
Return TextureLoader.FromFile(_Device, filename, _ImageSize.Width, _ImageSize.Height, 0, 0, 0, Pool.Managed, Filter.Linear, Filter.Linear, 0)
End Function

Private Sub Render()
If _Device IsNot Nothing Then
Dim srcRectangle As New Rectangle(Point.Empty, _ImageSize)
Dim destSize As New Size(CInt(_ImageSize.Width * _ZoomFactor), CInt(_ImageSize.Height * _ZoomFactor))
_Device.Clear(ClearFlags.Target, Me.BackColor, 0, 0)
_Device.BeginScene()
Using sprite As New Sprite(_Device)
sprite.Begin(SpriteFlags.AlphaBlend)
sprite.Draw2D(_Texture, srcRectangle, destSize, _
_RotationCentre, _Rotation, _ImageCentre, Color.White)
sprite.End()
End Using
_Device.EndScene()
_Device.Present()
End If
End Sub

The identifiers beginning with underscores are defined at class level. I have tried variations on arguments such as Width, Height, Pool and Filter without solving the problem. Assuming there isn't something simple I need to change, can anyone recommend a better technique for handling large images (e.g. > 10K * 10K pixels) with DirectX?

cheers, BB

### #1boops boops

Posted 19 September 2012 - 07:18 AM

Hi everyone,
I'm making a custom control in VB.Net which provides image panning, zooming and rotation.It's working the way I like in GDI+ except that it's slow and can't deal with anything over about 4096x4096 pixels. So I decided to try rendering in DirectX instead. It's definitely zippier but there is still an upper limit on image size: now, after column/row 4095 or so, the last column/row is repeated in the render to produce stripes of colour. I gather from this thread that the upper size limit is a long known problem. I'm a bit of a dinosaur (WinXPsp3 with DX3d10, 2GB system memory, 256KB video) so I guess I am running into the same thing.

This is my first time using DirectX and I arrived at the following code by taking available examples and stripping out whatever seemed superflous.
Private Sub InitiateDevice()
Dim pParams As New PresentParameters With {.Windowed = True, .SwapEffect = SwapEffect.Discard, .BackBufferCount = 0}
_Device = New Device(0, DeviceType.Hardware, Me.Handle, CreateFlags.MixedVertexProcessing, pParams)
_Device.SetRenderState(RenderStates.AlphaBlendEnable, True)
_Device.RenderState.SourceBlend = Blend.SourceAlpha
End Sub

Private Function GetTextureFromFile(filename As String) As Texture
Return TextureLoader.FromFile(_Device, filename, _ImageSize.Width, _ImageSize.Height, 0, 0, 0, Pool.Managed, Filter.Linear, Filter.Linear, 0)
End Function

Private Sub Render()
If _Device IsNot Nothing Then
Dim srcRectangle As New Rectangle(Point.Empty, _ImageSize)
Dim destSize As New Size(CInt(_ImageSize.Width * _ZoomFactor), CInt(_ImageSize.Height * _ZoomFactor))
_Device.Clear(ClearFlags.Target, Me.BackColor, 0, 0)
_Device.BeginScene()
Using sprite As New Sprite(_Device)
sprite.Begin(SpriteFlags.AlphaBlend)
sprite.Draw2D(_Texture, srcRectangle, destSize, _
_RotationCentre, _Rotation, _ImageCentre, Color.White)
sprite.End()
End Using
_Device.EndScene()
_Device.Present()
End If
End Sub

The identifiers beginning with underscores are defined at class level. I have tried variations on arguments such as Width, Height, Pool and Filter without solving the problem. Assuming there isn't something simple I need to change, can anyone recommend a better technique for handling large images (e.g. > 10K * 10K pixels) with DirectX?

cheers, BB

PARTNERS