Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


#Actualhaegarr

Posted 18 November 2013 - 07:22 AM

1. The cited tutorial is about texture mapping, while your code snippet is about pixel blitting! That are different things. Are you sure that you want to use glDrawPixels?

 

2. The variable j inside the loop header is not used anywhere. Perhaps you wanted to use it for indexing the array of bytes?

 

3. The definition of the array "bytes" is not shown. It probably has to be a "unsigned char[size*3]".

 

4. It seems that you want to convert color components from normalized unsigned byte (i.e. in range 0 .. 255) to floating point (in range 0.0 .. 1.0), because OpenGL expects color given in floating point in unit range. Using indices i and j here without any specific meaning, the conversion would look like below. It first casts the byte into a floating point number and scales that down into the required range.

pixels[i] = float(bytes[j]) / 255;

5. The addressing schemes of pixels and bytes are not correct. You probably want to handle the components of all 3 channels per iteration, and you probably want to reverse the order from BGR to RGB. This, together with the format conversion, may look like so:

for(int i=0; i<size*3; i+=3) {
   pixels[i+0] = float(bytes[i+2]) / 255; // red component
   pixels[i+1] = float(bytes[i+1]) / 255; // green component
   pixels[i+2] = float(bytes[i+0]) / 255; // blue component
}

-

However, I'm quite sure that neither blitting nor floating point conversion is what you actually want to do. You first have to clarify your intention...


#4haegarr

Posted 18 November 2013 - 07:22 AM

1. The cited tutorial is about texture mapping, while your code snippet is about pixel blitting! That are different things. Are you sure that you want to use glDrawPixels?

 

2. The variable j inside the loop header is not used anywhere. Perhaps you wanted to use it for indexing the array of bytes?

 

3. The definition of the array "bytes" is not shown. It probably has to be a "unsigned char[size*3]".

 

4. It seems that you want to convert color components from normalized unsigned byte (i.e. in range 0 .. 255) to floating point (in range 0.0 .. 1.0), because OpenGL expects color given in floating point in unit range. Using indices i and j here without any specific meaning, the conversion would look like below. It first casts the byte into a floating point number and scales that down into the required range.

pixels[i] = float(bytes[j]) / 255;

5. The addressing schemes of pixels and bytes are not correct. You probably want to handle the components of all 3 channels per iteration, and you probably want to reverse the order from BGR to RGB. This, together with the format conversion, may look like so:

for(int i=0; i<size*3; i+=3) {
   pixels[i+0] = float(bytes[i+2]) / 255; // red component
   pixels[i+1] = float(bytes[i+1]) / 255; // green component
   pixels[i+2] = float(bytes[i+0]) / 255; // blue component
}

However, I'm quite sure that neither blitting nor floating point conversion is what you actually want to do. You first have to clarify your intention...


#3haegarr

Posted 18 November 2013 - 07:22 AM

1. The cited tutorial is about texture mapping, while your code snippet is about pixel blitting! That are different things. Are you sure that you want to use glDrawPixels?

 

2. The variable j inside the loop header is not used anywhere. Perhaps you wanted to use it for indexing the array of bytes?

 

3. The definition of the array "bytes" is not shown. It probably has to be a "unsigned char[size*3]".

 

4. It seems that you want to convert color components from normalized unsigned byte (i.e. in range 0 .. 255) to floating point (in range 0.0 .. 1.0), because OpenGL expects color given in floating point in unit range. Using indices i and j here without any specific meaning, the conversion would look like below. It first casts the byte into a floating point number and scales that down into the required range.

pixels[i] = float(bytes[j]) / 255;

5. The addressing schemes of pixels and bytes are not correct. You probably want to handle the components of all 3 channels per iteration, and you probably want to reverse the order from BGR to RGB. This, together with the format conversion, may look like so:

for(int i=0; i<size*3; i+=3) {
   pixels[i+0] = float(bytes[i+2]) / 255; // red component
   pixels[i+1] = float(bytes[i+1]) / 255; // green component
   pixels[i+2] = float(bytes[i+0]) / 255; // blue component
}

However, I'm quite sure that neither blitting nor floating point conversion is what you actually want to do. You first have to clarify your intention...


#2haegarr

Posted 18 November 2013 - 07:21 AM

1. The cited tutorial is about texture mapping, while your code snippet is about pixel blitting! That are different things. Are you sure that you want to use glDrawPixels?

 

2. The variable j inside the loop header is not used anywhere. Perhaps you wanted to use it for indexing the array of bytes?

 

3. The definition of the array "bytes" is not shown. It probably has to be a "unsigned char[size*3]".

 

4. It seems that you want to convert color components from normalized unsigned byte (i.e. in range 0 .. 255) to floating point (in range 0.0 .. 1.0), because OpenGL expects color given in floating point in unit range. Using indices i and j here without any specific meaning, the conversion would look like below. It first casts the byte into a floating point number and scales that down into the required range.

pixels[i] = float(bytes[j]) / 255;

5. The addressing schemes of pixels and bytes are not correct. You probably want to handle the components of all 3 channels per iteration, and you probably want to reverse the order from BGR to RGB. This, together with the format conversion, may look like so:

for(int i=0; i<size*3; i+=3) {
   pixels[i+0] = float(bytes[i+2]) / 255; // red component
   pixels[i+1] = float(bytes[i+1]) / 255; // green component
   pixels[i+2] = float(bytes[i+0]) / 255; // blue component
}

However, I'm quite sure that neither blitting nor floating point conversion is what you actually want to do. You first have to clarify your intention...


#1haegarr

Posted 18 November 2013 - 07:21 AM

1. The cited tutorial is about texture mapping, while your code snippet is about pixel blitting! That are different things. Are you sure that you want to use glDrawPixels?

 

2. The variable j inside the loop header is not used anywhere. Perhaps you wanted to use it for indexing the array of bytes?

 

3. The definition of the array "bytes" is not shown. It probably has to be a "unsigned char[size*3]".

 

4. It seems that you want to convert color components from normalized unsigned byte (i.e. in range 0 .. 255) to floating point (in range 0.0 .. 1.0), because OpenGL expects color given in floating point in unit range. Using indices i and j here without any specific meaning, the conversion would look like below. It first casts the byte into a floating point number and scales that down into the required range.

pixels[i] = float(bytes[j]) / 255;

5. The addressing schemes of pixels and bytes are not correct. You probably want to handle the components of all 3 channels per iteration, and you probably want to reverse the order from BGR to RGB. This, together with the format conversion, may look like so:

for(int i=0; i<size*3; i+=3) {
   pixels[i+0] = float(bytes[i+2]) / 255; // red component
   pixels[i+1] = float(bytes[i+1]) / 255; // green component
   pixels[i+2] = float(bytes[i+0]) / 255; // blue component
}

However, I'm quite sure that neither blitting nor floating point conversion is what you actually want to do. You first have to clarify your intention...


PARTNERS