Jump to content
  • Advertisement
Sign in to follow this  
Sibil

OpenGL not-power-of-two Textures in Opengl 2.0

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey guys! I googled it not-power-of-two but I found more confused people asking about that that professional people doing tutorial :P From version 2.0 Opengl supports not-power-of-two texture but if just use glTexImage2D with a not-power-of-two image the program crashs. I have Win XP and so the native version of Opengl is 1.1... Do I have to use something like: PFNGLGENBUFFERSARBPROC glGenBuffersARB; glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB"); to use the TexImage2D of the glext.h...? Does exist a simple program to convert jpg in power-of-two size? I know probably somewhere there are 1000 million tutorials about this 2 questions... So just give me the link because I couldn't find it :P Thank u very much ;)

Share this post


Link to post
Share on other sites
Advertisement
NPOT textures work in the TEXTURE_2D target fine for me. If not for you, try the TEXTURE_RECTANGLE_ARB target if it is available to you, but remember a rectangle's tex coords range from [0-width][0-height] not [0-1][0-1] like normal.

Share this post


Link to post
Share on other sites
Quote:
Original post by Sibil
Hey guys!

I googled it not-power-of-two but I found more confused people asking about that that professional people doing tutorial :P

From version 2.0 Opengl supports not-power-of-two texture but if just use glTexImage2D with a not-power-of-two image the program crashs.
I have Win XP and so the native version of Opengl is 1.1...
Do I have to use something like:

PFNGLGENBUFFERSARBPROC glGenBuffersARB;
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");

to use the TexImage2D of the glext.h...?

Does exist a simple program to convert jpg in power-of-two size?

I know probably somewhere there are 1000 million tutorials about this 2 questions...
So just give me the link because I couldn't find it :P

Thank u very much ;)


If it crashes, there could be different reasons like data alignement is not correct. If you data alignment is 1, then call glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

If your driver reports GL 2.0 and up, then you can use NPOT and mipmaps.
Also, check if GL_ARB_texture_non_power_of_two is present. If present, then it should be completly hw accelerated. If not present, and if you use mipmaps, or anisotropy, or something other than GL_CLAMP_TO_EDGE, it will fall on software path.

Quote:
Does exist a simple program to convert jpg in power-of-two size?


Gimp, it is open source and free.

Share this post


Link to post
Share on other sites
I don't know if it was clear but I can use texture and mipmap with P.O.T. textures the problem occured with NPOT

Quote:

Gimp, it is open source and free.


I'm looking for a program that automaticaly resize the image...
Does Gimp do that? I've something like 40 texture and resize them one by one would be very a waste of time :P

Quote:

Also, check if GL_ARB_texture_non_power_of_two is present. If present, then it should be completly hw accelerated

How Can I check if GL_ARB_texture_non_power_of_two is present?

Quote:

If not present, and if you use mipmaps, or anisotropy, or something other than GL_CLAMP_TO_EDGE, it will fall on software path.


What does fall on software path?

Share this post


Link to post
Share on other sites
Do you want to upload NPOT textures to OpenGL? And I am guessing you don't have a OpenGL2.0 card? If so just use gluBuild2DMipmaps it will resize them for you to the nearest POT. Don't forget to set the min/max filter to correct usage formats.

Oh and get glee or glew extension loader libs. Either one is fine. I use GLEE. This will make your life a lot easier when using newer features.

Share this post


Link to post
Share on other sites
Quote:
Original post by Sibil
I don't know if it was clear but I can use texture and mipmap with P.O.T. textures the problem occured with NPOT

Quote:

Gimp, it is open source and free.


I'm looking for a program that automaticaly resize the image...
Does Gimp do that? I've something like 40 texture and resize them one by one would be very a waste of time :P

Quote:

Also, check if GL_ARB_texture_non_power_of_two is present. If present, then it should be completly hw accelerated

How Can I check if GL_ARB_texture_non_power_of_two is present?

Quote:

If not present, and if you use mipmaps, or anisotropy, or something other than GL_CLAMP_TO_EDGE, it will fall on software path.


What does fall on software path?


Anyway, it sounds like POW2 textures would do it for you. I don't know of any tool that can resize a bunch of textures but I'm sure it is easy to write one.
You can use gluScaleImage to scale.

To check if GL_ARB_texture_non_power_of_two or any other extension is present, there is tons of code out there. I use glhIsGLExtensionSupported from my own glhlibrary

The rendering will fall on the software path.

Share this post


Link to post
Share on other sites
Now that I think of it on the Mac there is a program called graphic converter that will batch work on textures...

Share this post


Link to post
Share on other sites
I've check the version with glGetString(GL_VERSION) and I've 2.0.1

However I discover that the program perfectly load NPOT texture!!!
except one of dimension 4050 x 3633 that was the first one that I've tried :P
There are restrictions on the size or on the memory?

Quote:

Also, check if GL_ARB_texture_non_power_of_two is present. If present, then it should be completly hw accelerated


I've also check glGetString(GL_EXTENSION) and in the list there's GL_ARB_texture_non_power_of_two .
That means that GL_ARB_texture_non_power_of_two is working or that I'm able to use that extension if I add some code...?

Share this post


Link to post
Share on other sites
A texture of that size is roughly 58 megabytes (assuming 8bpp RGBA), so it may very well be that you don't have enough (continguous) memory on the card. It depends on what you're allocating as render buffer and what you've uploaded already, of course.
For example, if you have window at 1280*1024, which is not really unreasonable today, that's already 5 MB just for the frame buffer (and up to 3 times as much if you do double/triple buffering). If you have antialiasing enabled, add to that the multisample buffers. Fragmentation may contribute a good bit to it too.

Another theoretical problem might be the maximum texture size, but I'm not aware of any card that's less than 5 years old that doesn't support at least 40962.

NPOT should generally work on OpenGL 1.1 cards too, with "should generally work" as in "should not crash".
The driver should silently allocate the next bigger POT size and simply leave some of it unused.

Share this post


Link to post
Share on other sites
Did you try as V-man said, and use glPixelStorei(GL_UNPACK_ALIGNMENT, 1); Because these dimensions 4050 x 3633 from a quick look don't fall on 4byte alignments. BTW what hardware are you on? Nvidia, ATI, integrated?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!