Hier wird das Bild in einem Datenspeicher eingelesen vom Openglfenster:
glReadBuffer_(#GL_FRONT)
glReadPixels_(0,0,127,127,#GL_RGB,#GL_UNSIGNED_BYTE,@lpBuffer())
SetDIBits_(hdc,hbmImage,0,128,lpBuffer,bmi,#DIB_RGB_COLORS)
Aber irgendwo ist da noch ein Fehler, weil das Bild rechts nicht dargestellt wird.
Wer kann mir weiterhelfen.
Danke.
mfg
peter
Code: Alles auswählen
XIncludeFile "opengl.pbi"
Global xx.f,yy.f,zz.f,scale.f,winkel.f 
Structure GLscreen
  container.l
  hWnd.l
  hDC.l
EndStructure
Procedure createdraw()
  ;DrawingMode(#PB_2DDrawing_Outlined)
  Circle(100,100,50,RGB(200,0,0))
 
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(150,20,20,20, RGB(255,0,0)) 
     
  FrontColor(RGB(255,255,0))
  For k=0 To 20
    LineXY(10,10+k*8,200, 0)
  Next
 
  ;DrawingMode(#PB_2DDrawing_Transparent)
  BackColor(RGB(100,255,0))
  FrontColor(RGB(0,0,255))
  DrawText(15,50,"TEXT")
EndProcedure
Procedure FindNextExp(Val)
  While a < Val
    a = 1 << b
    b + 1
  Wend
  ProcedureReturn a
EndProcedure
Procedure GLLoadAlphaTexture(image_nr,img_file.s,Filename.s,Texfilter,TransparentColor.l)
  If img_file="file"
    img.l     = LoadImage(#PB_Any, Filename.s)
    Width.l   = FindNextExp(ImageWidth(img))
    Height.l  = FindNextExp(ImageHeight(img))
    ResizeImage(img, Width, Height)
    Size.l    = Width * Height * 4
  EndIf
 
  If img_file="image" 
    img.l    = CreateImage(#PB_Any,256,256,24)
    Width.l  = FindNextExp(ImageWidth(img))
    Height.l = FindNextExp(ImageHeight(img))
    ResizeImage(img, Width, Height)
    Size.l   = Width * Height * 4
  EndIf 
 
  Dim ImageData.b(Size)
 
  bmi.BITMAPINFO
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       = Width
  bmi\bmiHeader\biHeight      = Height
  bmi\bmiHeader\biPlanes      = 1
  bmi\bmiHeader\biBitCount    = 32
  bmi\bmiHeader\biCompression = #BI_RGB
  bmi\bmiHeader\biSizeImage   = (bmi\bmiHeader\biWidth * bmi\bmiHeader\biHeight * bmi\bmiHeader\biBitCount / 8)-1
 
  hdc = StartDrawing(ImageOutput(img))   
    If img_file="image"
      createdraw()
    EndIf
    GetDIBits_(hdc, ImageID(img), 0, bmi\bmiHeader\biHeight, @ImageData(0), bmi, #DIB_RGB_COLORS) 
  StopDrawing()
 
  red   = Red (TransparentColor)
  green = Green(TransparentColor)
  blue  = Blue (TransparentColor)
 
  For k=0 To Size-1 Step 4
    b = ImageData(k  ) & $FF
    g = ImageData(k+1) & $FF
    r = ImageData(k+2) & $FF
   
    If r = red And g = green And b = blue
      ImageData(k+3) = 0
    Else
      ImageData(k+3) = $ff
    EndIf
   
    ImageData(k+2) = b
    ImageData(k  ) = r
  Next
   
  glGenTextures_(image_nr, @Tex)   
  glBindTexture_(#GL_TEXTURE_2D, Tex)
  glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
 
  If TexFilter = 0 
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)   
  ElseIf TexFilter = 1   
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
  EndIf
  FreeImage(img)
 
  ProcedureReturn Tex
EndProcedure
Procedure OpenGLScreen(*p.GLscreen,xx,yy,ww,hh)
  If *p
    container = ContainerGadget(#PB_Any,xx,yy,ww,hh)
    If container
      hwnd = GadgetID(container)
      hdc  = GetDC_(hwnd)
      pfd.PIXELFORMATDESCRIPTOR
      pfd\nSize    = SizeOf(PIXELFORMATDESCRIPTOR)
      pfd\nVersion = 1   
      pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
      pfd\iLayerType = #PFD_MAIN_PLANE
      pfd\iPixelType = #PFD_TYPE_RGBA
      pfd\cColorBits = 32
      pfd\cDepthBits = 32
      pixformat = ChoosePixelFormat_(hdc, pfd)
      SetPixelFormat_(hdc, pixformat, pfd)
      hrc = wglCreateContext_(hdc)
      wglMakeCurrent_(hdc, hrc)
      SwapBuffers_(hdc)
      *p\container = container
      *p\hWnd      = GadgetID(container)
      *p\hDC       = hdc
     
      glMatrixMode_(#GL_PROJECTION)
      gluPerspective_(45, 1, 1,100.0)
      glMatrixMode_(#GL_MODELVIEW)
      glEnable_(#GL_TEXTURE_2D)
      glEnable_(#GL_ALPHA_TEST)
      glAlphaFunc_(#GL_GREATER, 0.0)
      
      ProcedureReturn 1
    EndIf
  EndIf
EndProcedure
 
  OpenWindow(0, 300, 10, 520,520,  "test1") 
  OpenGLScreen(screen.GLscreen,10,10,128,128)
 
  Global Texture_1  =  GLLoadAlphaTexture(1,"image","auto.bmp",1,0) 
  glClearColor_(1.0, 0.0, 1.0, 1.0)
  
  scale=1
  zz=-1.5
  
  Global hbmImage = ImageID(0)
  Dim lpBuffer(128*128 * 4)
 
  Repeat
 
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT)
  glLoadIdentity_()
   
  glTranslatef_(0.0,0.0,zz)
  glRotatef_(-winkel+90,0.0,0.0,1.0)
  glScalef_(scale,scale,scale)
  glBindTexture_(#GL_TEXTURE_2D, Texture_1)
  glBegin_(#GL_QUADS)
   glTexCoord2f_(0.0, 1.0)  :   glVertex3f_(-0.5,  0.5,  0.0)
   glTexCoord2f_(1.0, 1.0)  :   glVertex3f_( 0.5,  0.5,  0.0)
   glTexCoord2f_(1.0, 0.0)  :   glVertex3f_( 0.5, -0.5,  0.0)
   glTexCoord2f_(0.0, 0.0)  :   glVertex3f_(-0.5, -0.5,  0.0)
  glEnd_()
  
  SwapBuffers_(screen\hdc)
  
  glReadBuffer_(#GL_FRONT)
  glReadPixels_(0,0,127,127,#GL_RGB,#GL_UNSIGNED_BYTE,@lpBuffer()) 
  SetDIBits_(hdc,hbmImage,0,128,lpBuffer,bmi,#DIB_RGB_COLORS)
                    
  StartDrawing(WindowOutput(0))   
   DrawImage(ImageID(0),200,10)   
  StopDrawing()   
     
  Event = WaitWindowEvent()
       
  WindowID = EventWindow()
 
  GadgetID = EventGadget()
 
  EventType = EventType()
         
  If GetAsyncKeyState_(#VK_Q)
     winkel=winkel+0.1
  ElseIf GetAsyncKeyState_(#VK_E)
     winkel=winkel-0.1
  EndIf       
 
 If GetAsyncKeyState_(#VK_W)
    zz=zz+0.001
    If zz>-1.0
      zz=-1.0
    EndIf 
 ElseIf GetAsyncKeyState_(#VK_S)
     zz=zz-0.001
 EndIf 
     
 Until Event = #PB_Event_CloseWindow
 ReleaseDC_(screen\hWnd,screen\hDC)