Jump to content

  • Log In with Google      Sign In   
  • 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