[PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_ReversedY

Just starting out? Need help? Post your questions and find answers here.
juankprada
User
User
Posts: 62
Joined: Tue Mar 18, 2014 4:25 pm
Location: Bogotá, Colombia

[PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_ReversedY

Post by juankprada »

I'm using the following code with a Windows and a Linux machine both 64bits to generate OpenGL textures out of a loaded image.

Code: Select all

Procedure LoadGlTexture(*tex.GLTexture)
        UsePNGImageDecoder()
	Protected image = LoadImage(#PB_Any, "data/gonghead.png")
	Protected textureId.i
	glEnable(#GL_BLEND)
	glGenTextures(1, @textureId)
	glBindTexture(#GL_TEXTURE_2D, textureId)
	
	; grab the pixel data into the buffer
	Protected *buffer
	Protected dbpixelFormat.b
	Protected widthInBytes	
	
	StartDrawing(ImageOutput(image))
 		*buffer = DrawingBuffer()
 		widthInBytes = DrawingBufferPitch()
 		dbpixelFormat.b = DrawingBufferPixelFormat()
 	StopDrawing()

        Protected invertedY.b = dbpixelFormat & #PB_PixelFormat_ReversedY   
 	Protected depth.b = dbpixelFormat ! #PB_PixelFormat_ReversedY
        ....
The textured is loaded in both machines and I am able to display them using glBegin()/glEnd() OpenGL instructions (the same vertex and texture coordinates for both machines).

The thing is in Linux the image is upside down. i.e Y inverted and the real issue is that using DrawingBufferPixelFormat() didn't reported the flag #PB_PixelFormat_ReversedY which I could use in order to flip the texture.
juankprada
User
User
Posts: 62
Joined: Tue Mar 18, 2014 4:25 pm
Location: Bogotá, Colombia

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by juankprada »

This is kind of old thread, But I havent receive any feedback on this. Is this normal operation? is this a bug? is somebody looking at this issue?

I would like to know more about the status of this. or if there is anything else needed from me to get it reviewd and fixed if possible


Thanks
Julian
Enthusiast
Enthusiast
Posts: 276
Joined: Tue May 24, 2011 1:36 pm

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Julian »

Any change of putting a zip file up with an example piece of code and the image you're using?

It makes things a lot easier to test if you provide a working example showing the problem :)
Fred
Administrator
Administrator
Posts: 18350
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Fred »

Yes, would be cool to have a full working snippet. The #PB_PixelFormat_ReversedY flag should be only set on Windows, as it's the way it handle bitmap. On linux this flag shouldn't be set.
Fred
Administrator
Administrator
Posts: 18350
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Fred »

Any chance to get a short code showing the issue ?
juankprada
User
User
Posts: 62
Joined: Tue Mar 18, 2014 4:25 pm
Location: Bogotá, Colombia

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by juankprada »

Sure, This is what I am using to load a PNG file and create an OpenGL texture with it:

Code: Select all

;---------------------------
; Structures
;---------------------------
Structure GLTexture
  id.i
  width.i
  height.i
  depth.i
  inverted.b
  *bytes ;data
EndStructure	


; Procedure used to load OpenGL Textures
Declare LoadGLTexture(*tex.GLTexture)



Procedure LoadGlTexture(*tex.GLTexture)
  
  UsePNGImageDecoder()
  
  Protected image = LoadImage(#PB_Any, "data/gonghead.png")
  Protected textureId.i
  
  glEnable(#GL_BLEND)
  glGenTextures(1, @textureId)
  glBindTexture(#GL_TEXTURE_2D, textureId)
  
  ; grab the pixel data into the buffer 
  StartDrawing(ImageOutput(image))
  Protected *buffer = DrawingBuffer()
  Protected widthInBytes = DrawingBufferPitch()
  Protected dbpixelFormat.b = DrawingBufferPixelFormat()
  StopDrawing()
  
  Protected invertedY.b = dbpixelFormat & #PB_PixelFormat_ReversedY   
  Protected depth.b = dbpixelFormat ! #PB_PixelFormat_ReversedY
  Protected imgWidth.i = ImageWidth(image)
  Protected imgHeight.i = ImageHeight(image)
  
  Protected openGLDepth
  Select depth
    Case #PB_PixelFormat_8Bits   
      openGLDepth = #GL_RED
    Case #PB_PixelFormat_16Bits      
      openGLDepth = #GL_RG
    Case #PB_PixelFormat_24Bits_RGB  
      openGLDepth = #GL_RGB
    Case #PB_PixelFormat_24Bits_BGR 
      openGLDepth = #GL_BGR
    Case #PB_PixelFormat_32Bits_RGB  
      openGLDepth = #GL_RGBA
    Case #PB_PixelFormat_32Bits_BGR 
      
      openGLDepth = #GL_BGRA
  EndSelect
  
  glTexParameteri (#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR);
  glTexParameteri (#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST);
  glTexParameteri (#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_CLAMP_TO_EDGE);
  glTexParameteri (#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_CLAMP_TO_EDGE);
  
  glTexImage2D (#GL_TEXTURE_2D, 0, #GL_RGBA, imgWidth, imgHeight, 0, openGLDepth, #GL_UNSIGNED_BYTE, *buffer);
  
  glDisable(#GL_BLEND)
  
  *tex\id = textureId
  *tex\bytes = *buffer
  *tex\width = imgWidth
  *tex\height = imgHeight
  
  If  invertedY.b = #PB_PixelFormat_ReversedY  
    *tex\inverted = #True
  Else
    *tex\inverted = #False
  EndIf	
  FreeImage(image)
  
  
EndProcedure
I am not sure it if its going to work out of the box for you as I am using a GLEW wrapper to have access to all OpenGL commands available (maybe there might be conflicts with the name convention used by default in PB for openGL commands)
Fred
Administrator
Administrator
Posts: 18350
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Fred »

Unfortunately, we need full working snippet.
juankprada
User
User
Posts: 62
Joined: Tue Mar 18, 2014 4:25 pm
Location: Bogotá, Colombia

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by juankprada »

Ok, here is a sample using OpenGL Gadget.

Code: Select all


Global RollAxisX.f
Global RollAxisY.f
Global RollAxisZ.f

Global RotateSpeedX.f = 1.0
Global RotateSpeedY.f
Global RotateSpeedZ.f = 1.0

Global ZoomFactor.f = 1.0 ; Distance of the camera. Negative value = zoom back

#GL_BGR=$80E0
#GL_BGRA=$80E1
#GL_RGB=$1907
#GL_RGBA=$1908

Structure GLTexture
  id.i
  width.i
  height.i
  depth.i
  inverted.b
  *bytes ;data
EndStructure	


; Procedure used to load OpenGL Textures
Declare LoadGLTexture(*tex.GLTexture)



Procedure LoadGlTexture(*tex.GLTexture)
  
  UsePNGImageDecoder()
  
  Protected image = LoadImage(#PB_Any, "data/gonghead.png")
  Protected textureId.i
  
  glEnable_(#GL_BLEND)
  glGenTextures_(1, @textureId)
  glBindTexture_(#GL_TEXTURE_2D, textureId)
  
  ; grab the pixel data into the buffer 
  StartDrawing(ImageOutput(image))
  Protected *buffer = DrawingBuffer()
  Protected widthInBytes = DrawingBufferPitch()
  Protected dbpixelFormat.b = DrawingBufferPixelFormat()
  StopDrawing()
  
  Protected invertedY.b = dbpixelFormat & #PB_PixelFormat_ReversedY   
  Protected depth.b = dbpixelFormat ! #PB_PixelFormat_ReversedY
  Protected imgWidth.i = ImageWidth(image)
  Protected imgHeight.i = ImageHeight(image)
  
  Protected openGLDepth
  Select depth
    Case #PB_PixelFormat_8Bits   
      openGLDepth = #GL_RED
   
    Case #PB_PixelFormat_24Bits_RGB  
      openGLDepth = #GL_RGB
    Case #PB_PixelFormat_24Bits_BGR 
      openGLDepth = #GL_BGR
    Case #PB_PixelFormat_32Bits_RGB  
      openGLDepth = #GL_RGBA
    Case #PB_PixelFormat_32Bits_BGR 
      
      openGLDepth = #GL_BGRA
  EndSelect
  
  glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR);
  glTexParameteri_ (#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST);
 
  glTexImage2D_ (#GL_TEXTURE_2D, 0, #GL_RGBA, imgWidth, imgHeight, 0, openGLDepth, #GL_UNSIGNED_BYTE, *buffer);
  
  glDisable_(#GL_BLEND)
  
  *tex\id = textureId
  *tex\bytes = *buffer
  *tex\width = imgWidth
  *tex\height = imgHeight
  
  If  invertedY.b = #PB_PixelFormat_ReversedY  
    *tex\inverted = #True
  Else
    *tex\inverted = #False
  EndIf	
  FreeImage(image)
  
  
EndProcedure






OpenWindow(0, 0, 0, 530, 320, "OpenGL Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


OpenGLGadget(1, 0, 0, 530, 320)
glClearColor_(0.4, 0.6, 0.9, 1)

AddWindowTimer(0, 1, 16) ; about 60 fps
Global tex.GLTexture 
      
LoadGLTexture(@tex)
Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Timer
        If EventTimer() = 1
         SetGadgetAttribute(1, #PB_OpenGL_SetContext, #True)
         glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);
        
        
        
        glMatrixMode_(#GL_PROJECTION);
        glPushMatrix_()              ;
        glLoadIdentity_()            ;
        glOrtho_(0.0, 800, 0.0, 600, -1.0, 1.0);
        glMatrixMode_(#GL_MODELVIEW)           ;
        glPushMatrix_()                        ;
        
        
        glLoadIdentity_();
        glDisable_(#GL_LIGHTING);
        
        glBindTexture_(#GL_TEXTURE_2D, tex\id)
        glEnable_(#GL_TEXTURE_2D)
        glEnable_(#GL_BLEND)
        glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA);
        glBegin_(#GL_QUADS)
        
        glTexCoord2f_(0.0, 0.0); 
        glVertex3f_( 0.0, 0.0,  0.0);
        
        
        glTexCoord2f_(0.0, 1.0); 
        glVertex3f_( 0.0,  120,  0.0);  
        
        
        
        glTexCoord2f_(1.0, 1.0); 
        glVertex3f_( 60.2,  120.0,  0.0);
        
        
        
        glTexCoord2f_(1.0, 0.0); 
        glVertex3f_( 60.2,  0.0,  0.0);
        
        
        glEnd_()
        glFinish_()
        SetGadgetAttribute(1, #PB_OpenGL_FlipBuffers, #True)
      EndIf
  EndSelect
  
Until Event = #PB_Event_CloseWindow

__________________________________________________
Quote tags>Code tags
14.12.2015
RSBasic
Fred
Administrator
Administrator
Posts: 18350
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Fred »

After investigation, it's an error in your code: you affect DrawingBufferPixelFormat() to a '.b' variable which is wrong, as #PB_PixelFormat_ReversedY value is 32768. In a general rule you should not use .b/.w/.a/.u/.l outside of structure or array, as it brings no advantage, but you can truncate results very easily. Also the test to remove the flag should be "dbpixelFormat & ~#PB_PixelFormat_ReversedY" now. It correctly return "inversed" on Windows, and "not inversed" on Linux/OSX. Another note: to use the *buffer directly from DrawingBuffer(), StopDrawing() should not be called before the end of the use, as it does release it ! So it can work if you are lucky, but will fail or gives strange results/crash in other case.

Code: Select all

Global RollAxisX.f
Global RollAxisY.f
Global RollAxisZ.f

Global RotateSpeedX.f = 1.0
Global RotateSpeedY.f
Global RotateSpeedZ.f = 1.0

Global ZoomFactor.f = 1.0 ; Distance of the camera. Negative value = zoom back

#GL_BGR=$80E0
#GL_BGRA=$80E1
#GL_RGB=$1907
#GL_RGBA=$1908

Structure GLTexture
id.i
width.i
height.i
depth.i
inverted.b
*bytes ;data
EndStructure


; Procedure used to load OpenGL Textures
Declare LoadGLTexture(*tex.GLTexture)



Procedure LoadGlTexture(*tex.GLTexture)

UsePNGImageDecoder()

Protected image = LoadImage(#PB_Any, "shark.png")
Protected textureId.i

glEnable_(#GL_BLEND)
glGenTextures_(1, @textureId)
glBindTexture_(#GL_TEXTURE_2D, textureId)

; grab the pixel data into the buffer
StartDrawing(ImageOutput(image))
Protected *buffer = DrawingBuffer()
Protected widthInBytes = DrawingBufferPitch()
Protected dbpixelFormat = DrawingBufferPixelFormat()

Protected invertedY = dbpixelFormat & #PB_PixelFormat_ReversedY
Protected depth = dbpixelFormat & ~#PB_PixelFormat_ReversedY
Protected imgWidth.i = ImageWidth(image)
Protected imgHeight.i = ImageHeight(image)

Protected openGLDepth
Select depth
Case #PB_PixelFormat_8Bits
openGLDepth = #GL_RED

Case #PB_PixelFormat_24Bits_RGB
openGLDepth = #GL_RGB
Case #PB_PixelFormat_24Bits_BGR
openGLDepth = #GL_BGR
Case #PB_PixelFormat_32Bits_RGB
openGLDepth = #GL_RGBA
Case #PB_PixelFormat_32Bits_BGR

openGLDepth = #GL_BGRA
EndSelect

glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR);
glTexParameteri_ (#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST);

glTexImage2D_ (#GL_TEXTURE_2D, 0, #GL_RGBA, imgWidth, imgHeight, 0, openGLDepth, #GL_UNSIGNED_BYTE, *buffer);

glDisable_(#GL_BLEND)

*tex\id = textureId
*tex\bytes = *buffer
*tex\width = imgWidth
*tex\height = imgHeight

StopDrawing()


If invertedY = #PB_PixelFormat_ReversedY
*tex\inverted = #True
Else
*tex\inverted = #False
EndIf

Debug *tex\inverted

FreeImage(image)


EndProcedure






OpenWindow(0, 0, 0, 530, 320, "OpenGL Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


OpenGLGadget(1, 0, 0, 530, 320)
glClearColor_(0.4, 0.6, 0.9, 1)

AddWindowTimer(0, 1, 16) ; about 60 fps
Global tex.GLTexture

LoadGLTexture(@tex)
Repeat
Event = WaitWindowEvent()

Select Event
Case #PB_Event_Timer
If EventTimer() = 1
SetGadgetAttribute(1, #PB_OpenGL_SetContext, #True)
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);



glMatrixMode_(#GL_PROJECTION);
glPushMatrix_() ;
glLoadIdentity_() ;
glOrtho_(0.0, 800, 0.0, 600, -1.0, 1.0);
glMatrixMode_(#GL_MODELVIEW) ;
glPushMatrix_() ;


glLoadIdentity_();
glDisable_(#GL_LIGHTING);

glBindTexture_(#GL_TEXTURE_2D, tex\id)
glEnable_(#GL_TEXTURE_2D)
glEnable_(#GL_BLEND)
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA);
glBegin_(#GL_QUADS)

glTexCoord2f_(0.0, 0.0);
glVertex3f_( 0.0, 0.0, 0.0);


glTexCoord2f_(0.0, 1.0);
glVertex3f_( 0.0, 120, 0.0);



glTexCoord2f_(1.0, 1.0);
glVertex3f_( 60.2, 120.0, 0.0);



glTexCoord2f_(1.0, 0.0);
glVertex3f_( 60.2, 0.0, 0.0);


glEnd_()
glFinish_()
SetGadgetAttribute(1, #PB_OpenGL_FlipBuffers, #True)
EndIf
EndSelect

Until Event = #PB_Event_CloseWindow
juankprada
User
User
Posts: 62
Joined: Tue Mar 18, 2014 4:25 pm
Location: Bogotá, Colombia

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by juankprada »

i feel so ashamed for posting a bug report with errors in the code. Sorry for making you waste your time and thanks for figuring out the errors.
Fred
Administrator
Administrator
Posts: 18350
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: [PB 5.31] DrawingBufferPixelFormat-#PB_PixelFormat_Rever

Post by Fred »

No problem, really.
Post Reply