Jump to content
  • Advertisement
Sign in to follow this  
The Magical Pot

Problems with storing fractions in variables

This topic is 1961 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

Hello!

 

I'm using OpenGL to render things in my game, but I'm haveing some problems. OpenGL uses decimals/fractions between 0 and 1 to locate pixels in a given texture. (for example, if I want to locate the 8th pixel on the x-axis in an image that's 32 pixels wide, I would type 'x=8/32' instead of 'x=8')

The problem is that I can't put fractions into float variables, (which would be convenient in my code) I can only use decimals. I can't write 'float x = 8/32' because the result of 8/32 isn't 0.25, but when I write 'float x = 0.25' it works perfectly.

 

This is a snippet that demonstrates how I render:

 

 

glBegin( GL_QUADS );
       glTexCoord2f( 0.f, 0.f );    glVertex2f(    0.f,   0.f );
       glTexCoord2f( 8/32, 0.f );    glVertex2f( 8.f,   0.f );
       glTexCoord2f( 8/32, 8/32 ); glVertex2f( 8.f, 8.f );
       glTexCoord2f( 0.f, 8/32 ); glVertex2f( 0.f, 8.f );
glEnd();

 

I just wanted to ask this question before I start a suboptimal solution. Am I missing something or do I have to work around it? Am I using the wrong type of variables to store fractions? Is it the 'glTexCoord2f' function that's the problem?

 

Thanks.

Edited by The Magical Pot

Share this post


Link to post
Share on other sites
Advertisement

Hi.

If you write this:
 

float number = 1/4;

We know that 1/4 = 0.25, but we if use integers when dividing the reuslt will also be an integer. Integers can not hold decimal number, so it will round it to a whole number. e.g 0.

If you type:
 

float number = 1.0f / 4.0f;

now the operation will return a decimal number.

to sum it up:
 

float f1 = 1/4; // f1 is now 0
float f2 = 1.0f/4.0f; //f2 is now 0.25


Edited by HermanssoN

Share this post


Link to post
Share on other sites

The reason it appears to not work is that "8/32" is integer division because both operands are integers, and the result of integer division is an integer. You need to ensure that at least one operand of the division has a floating point type to get a floating point division. For example: 8.0/32, 8/32.0, 8.0/32.0, static_cast<float>(8)/32, or whatever method you want, as long as at least one operand is not an integer.

 

But you can also use the texture matrix.

 

glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScale(1.0/32, 1.0/32, 1);
Edited by Brother Bob

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!