Gedrehtes Ogl-Bild auf dem Window darstellen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Gedrehtes Ogl-Bild auf dem Window darstellen

Beitrag von super_castle »

Hallo, das mit Draw gezeichnete Bild im Openglfenster(128x128) soll als externes Bild rechts auf dem Windows gezeichnet werden. Mit den Tasten wird es im Openglfenster gedreht und gezoomt.

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)
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag von super_castle »

So ,kann jetzt das gedrehte Bild darstellen.

Aber der ganze Screen wird in Purebasic als Openglscreen genommen, nicht nur das kleine Fenster (128x128 Pixel) mit welchem ich rumspiele.

Aufgrund von diesem verdrehten Kauderwelch mit Opengl kann man keine Sprite mehr nebenbei darstellen, obwohl das Openglfenster nur 128x128 Pixel gross ist.

Ist ein scheiss....
Schafft man das eine , klappt das andere nicht...hm...

mfg
Antworten