More newbie texture questions
I'm trying to convert my old 2D GUI engine to my new 3D editor. The skin for all controls reside in a single image. From what I do know about 3D textures (which doesn't amount to a whole bunch), they need to be sized by a power of 2. Does this mean the texture itself needs to be aligned this way, or do the U,V coordinates also have to be aligned by powers of 2?
Also, do textures usually have to be square? Or is it okay to use 32x64 textures, etc?
For example, can I create a 256x256 texture that contains all of my control bitmaps, then create a square mesh sized 10.0fx5.0f and assign it UV coordinates 40.0f,40.0f to 50.0f,45.0f for a check box control?
Thanks for any help, and sorry to spam the board with so many questions!
EDIT: Feel free to move this to another forum if it should be
[edited by - Jiia on May 8, 2004 12:26:17 PM]
Texture coordinates, 0.0f...1.0f, represent the whole texture size, regardless of the actual size of the texture data.
So, if you want to tile a texture two times in both U and V on a quad, set the U and V to 0 on top-left corner, and 2.0 on the lower-right corner.
Texture coordinates don't have to be powers of 2, they are just floating point numbers. The texture data itself, however, is required to be in powers of two on most cards (not on recent cards anymore, though).
Whether the textures have to be square is also hardware-dependent separately of the ^2 issue.
-Nik
[edited by - Nik02 on May 8, 2004 12:50:22 PM]
So, if you want to tile a texture two times in both U and V on a quad, set the U and V to 0 on top-left corner, and 2.0 on the lower-right corner.
Texture coordinates don't have to be powers of 2, they are just floating point numbers. The texture data itself, however, is required to be in powers of two on most cards (not on recent cards anymore, though).
Whether the textures have to be square is also hardware-dependent separately of the ^2 issue.
-Nik
[edited by - Nik02 on May 8, 2004 12:50:22 PM]
Damn, it totally slipped my mind about the 0.0f to 1.0f UV coordinates. How would I be able to use real image coordinates that way?
Lets see.. 256.. 40th pixel.. 0.15625?? That totally sucks Wouldn''t there be extreme problems trying to set the texture coordinate to 0.15625? Or is that okay? Isn''t there an easier way to do this? How in the world can a guy have a non power-of-2, non-square shaped image shown on the screen?
How is this usually done? Are there any detailed tutorials about drawing 2D images over a 3D engine? I know the basics like creating the mesh and setting up the projection & view matrices, but a lot of what I need to do seems impossible.
Lets see.. 256.. 40th pixel.. 0.15625?? That totally sucks Wouldn''t there be extreme problems trying to set the texture coordinate to 0.15625? Or is that okay? Isn''t there an easier way to do this? How in the world can a guy have a non power-of-2, non-square shaped image shown on the screen?
How is this usually done? Are there any detailed tutorials about drawing 2D images over a 3D engine? I know the basics like creating the mesh and setting up the projection & view matrices, but a lot of what I need to do seems impossible.
quote:Original post by Jiia
Lets see.. 256.. 40th pixel.. 0.15625?? That totally sucks Wouldn''t there be extreme problems trying to set the texture coordinate to 0.15625? Or is that okay? Isn''t there an easier way to do this? How in the world can a guy have a non power-of-2, non-square shaped image shown on the screen?
What really is the problem? You generally know the texture size and the size of the area that you need to use from it. Just perform the division, and be happy :D
Remember, the texture coordinates are not integers, it is perfectly valid to represent a number like 0.15625 on them.
-Nik
put your controls in one large file. every control is 256x256 big. Now you write a function which reads 256x256 big areas from this file an saves it to a direct3d texture.
so you have for every control an own texture
scio me nihil scire
Ceterum censeo, carthaginem delendam esse
so you have for every control an own texture
scio me nihil scire
Ceterum censeo, carthaginem delendam esse
quote:Original post by Nik02 What really is the problem? You generally know the texture size and the size of the area that you need to use from it. Just perform the division, and be happy :DIt''s not a problem, I just didn''t realize it was okay to do this. And this is not another hardware specific issue?? Sounds great, thanks for the help!
Remember, the texture coordinates are not integers, it is perfectly valid to represent a number like 0.15625 on them.
quote:put your controls in one large file. every control is 256x256 big. Now you write a function which reads 256x256 big areas from this file an saves it to a direct3d texture.256x256 would be a bit extreme for a checkbox / mouse cursor Still, I understood your point. Thanks!
so you have for every control an own texture
Texture coordinates have not been hardware specific since the dawn of commercial 3d acceleration. You will not find a 3d card that doesn''t support at least one set of them (unless it is some very exotic model).
-Nik
-Nik
I''m sorry to ask so many questions, but can I throw one more in here?
Is it unheard of to modify U,V coordinates on the fly? Can I create a 2D graphics engine that relies on a single square mesh to draw everything? It seems like a huge burden to be required to create a mesh for every little thing that may happen to pop up on the screen. It also seems strange that it''s so simple to set a different texture but not quite simple to modify U,Vs.
One other thing. Why is it that so many professional games have such horribly slow 2D interfaces? The games runs smoother than silk, then they throw up this horrid 2D interface where the mouse jumps 40 pixels per frame.. As a matter of fact, it seems like I can remember more games having slow interfaces than fast. Even the very most recent games.
Is it unheard of to modify U,V coordinates on the fly? Can I create a 2D graphics engine that relies on a single square mesh to draw everything? It seems like a huge burden to be required to create a mesh for every little thing that may happen to pop up on the screen. It also seems strange that it''s so simple to set a different texture but not quite simple to modify U,Vs.
One other thing. Why is it that so many professional games have such horribly slow 2D interfaces? The games runs smoother than silk, then they throw up this horrid 2D interface where the mouse jumps 40 pixels per frame.. As a matter of fact, it seems like I can remember more games having slow interfaces than fast. Even the very most recent games.
You could use a dynamic vertex buffer or simply use DrawPrimitiveUP methods to render directly from the system memory.
Unless you're calling DPUP tens to hundreds of times per frame, you may not notice the difference. For static geometry, though, video memory vertex buffers are the most efficient.
-Nik
EDIT: And, of course you can use vertex shaders to modify the existing coordinates on-the-fly - that way, you don't have to reupload the vertex data if only small changes are needed.
Then there is the concept of multi streaming, in where the texture coordinates are in a separate vertex buffer.
The above two are advanced techniques, but IMHO it is still beneficial for you to consider them at some point.
[edited by - Nik02 on May 8, 2004 4:49:03 PM]
Unless you're calling DPUP tens to hundreds of times per frame, you may not notice the difference. For static geometry, though, video memory vertex buffers are the most efficient.
-Nik
EDIT: And, of course you can use vertex shaders to modify the existing coordinates on-the-fly - that way, you don't have to reupload the vertex data if only small changes are needed.
Then there is the concept of multi streaming, in where the texture coordinates are in a separate vertex buffer.
The above two are advanced techniques, but IMHO it is still beneficial for you to consider them at some point.
[edited by - Nik02 on May 8, 2004 4:49:03 PM]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement