Skip to main content
GameDev.net gamedev.net
🔒 Locked

Managed DirectX Texture Coordinate Issues

Started by Fresh Dec 20, 2004 at 7:20 PM 4 replies 1.5k views
Original Post
Fresh
Fresh
I am using C# and Managed DirectX. Is there a way to tell a texture how texture coordinates map across its surface? Consider the following: texture = TextureLoader.FromFile(dev, "eye.png", 0, 0, 1, 0, Format.Unknown, Pool.Default, Filter.Box, Filter.None, 0); SurfaceDescription sd = texture.GetLevelDescription(0); System.Console.Write("Height: {0}, Width: {1}", sd.Height, sd.Width); eye.png is an image with dimensions of around 600x500. The above code tells me that TextureLoader has given texture a size of 1024x512, which is to be expected. When I render this, the uv coordinate (1.0, 1.0) maps to the far corner of the *image* of the eye (texel 600x500) and not at the far corner of the *texture* (texel 1024x512). Now consider: destTexture = new Texture(dev, 1024, 512, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); In this case the uv coordinate (1.0, 1.0) will always map to the far corner of the *texture* (texel 1024x512). Given that the images I intend to put in destTexture are not of this size exactly, I would like to be able to change this mapping in the clean way that TextureLoader seems to do. Does anybody know how TextureLoader is changing this mapping, and how I can do it for textures I create myself? Thanks, r.
The Frugal Gourmet
The Frugal Gourmet
I may be oversimplifying your problem, but I believe you are asking how to draw part of a source image.

It's actually very simple. Just change the texture coordinates. They represent the percentage of the texture that's drawn from 0.0 (0%) to 1.0 (100%).

So, if you want to draw a 600x500 portion from a 1024 x 768 portion you would use these texture coordinates.

Left: 0.0f, Top: 0.0f, Right: .586f, Bottom: .651f

Note that: you must also appropriately change the target size you are drawing to! So, only specify the with and height of a 600x500 quad.


Co-creator of Star Bandits -- a graphical Science Fiction multiplayer online game, in the style of "Trade Wars'.
Fresh
Fresh
Yes, I agree I can store the percentages of the texture I need to draw for the various sized images I might place in it.

The point I was trying to make is that TextureLoader has somehow conveniently mapped your:

(1) Left: 0.0f, Top: 0.0f, Right: .586f, Bottom: .651f

To:

(2) Left: 0.0f, Top: 0.0f, Right: 1.0f, Bottom: 1.0f

i.e. to draw the full image loaded by TextureLoader I do not need to worry about the relation between the image size and the texture size. I just draw it with the texture coordinates in (2) and it works.


I thought perhaps when I call

device.SetTexture(0, texture);

that a TextureTransform is setup, doing the above scaling of texture coordinates. But a call to

System.Console.WriteLine(device.TextureState[0].TextureTransform.ToString());

informs me that even after setting the texture, transformations of the coordinate transforms are disabled.


Does anybody know how TextureLoader achieves this magic?

r.
AndyM
AndyM
thats the magic that happens when you load a non power-of-2 sized image.
Texture dimensions have to be a power of 2.
Fresh
Fresh
> thats the magic that happens when you load a non power-of-2 sized image.
> Texture dimensions have to be a power of 2.

I must not be making myself clear. TextureLoader has somehow sensed that this image will not use its entire texture and has arranged it for me, the user, so that the uv coordinate (1.0, 1.0) maps to the bottom right hand corner of the image and not of the texture.

As far as I can tell, the Texture object returned by TextureLoader is an ordinary Texture object, for which I don't see any facility for remapping texture coordinates. So how does the API know to treat texture coordinates across a Texture loaded by TextureLoader specially?

Surely somebody must have come across this before...

r.
Fresh
Fresh
OK I understand: the bitmap is stretched to fill the entire texture at load time.

r.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.