# Displaying large images in DX10

This topic is 1950 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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? Edited by boops boops

##### Share on other sites
im not very well versed, but first are you using some kind of 10 on 9 cause last i heard (granted it was several years ago) directx10 couldn't run on xp, and second a 256 mb card wont be able to handle a 32bpp 10k x 10k texture at once, you would have to upload and draw in pieces in a semi synchronous way if it were to work at all( like upload and draw a 2500x2500 texture, then change its coordinates and do it again 15 times and then swap the backbuffer?), i think, but again im not well versed enough with that pipeline to know how it allocates storage between textures and output, but once you are through the shaders even a 1080p 32bpp screen is only like 8mB, so i would think it should fit. otherwise i think it is possible to run the shaders in software on the cpu instead of on the gpu, but again i am not sure what xp would do with that.

##### Share on other sites
Yeah you would have to break up such a large texture into sub-images. I don't have an example, but I'm sure you can get some inspiration by searching for "tiling engine" or "tilemap", as the problem is similar to that of an overhead 2D game - large background that needs to be tiled/streamed in as you move about. Edited by Starnick