GetDIBits_ durch einen anderen Befehl ersetzen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
wasser
Beiträge: 125
Registriert: 27.11.2006 21:16

GetDIBits_ durch einen anderen Befehl ersetzen

Beitrag von wasser »

Hallo Darkdragon, dieser Befehl setzt andere Farbwerte in die Texture wenn ich Texture und glcolor zusammen in einer Scene benutze : GetDIBits_


Aussage im Internet :
GetDIBits füllt die Farbtabelle nicht ordnungsgemäß aus, wenn DIB-Abschnitte mit 1 Bit/Pixel oder 4 Bit/Pixel in das DIB-Format mit 8 Bit/Pixel konvertiert werden. Mit falschen Werten wird die Farbentabelle initialisiert statt die Farbentabelle des Bilds mit 8 Bit initialisieren, das die Farben aus der Farbentabelle des Quellbilds verwendet.
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel Microsoft-Produkten handelt.

Kannst du diesen Befehl durch einen anderen ersetzen :
GetDIBits_(hdc, ImageID(img), 0, bmi\bmiHeader\biHeight, @ImageData(0), bmi, #DIB_RGB_COLORS)

MFG

Code: Alles auswählen

Procedure GLLoadAlphaTexture(Filename.s, TexFilter, TransparentColor)
  img       = LoadImage(#PB_Any, Filename.s)
  Width.l   = FindNextExp(ImageWidth(img))
  Height.l  = FindNextExp(ImageHeight(img))
  ResizeImage(img, Width, Height)
  Size.l    = Width * Height * 4
 
  Dim ImageData.b(Size)
 
  hdc = StartDrawing(ImageOutput(img))
  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
 
  GetDIBits_(hdc, ImageID(img), 0, bmi\bmiHeader\biHeight, @ImageData(0), bmi, #DIB_RGB_COLORS)
 
  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
  StopDrawing()
 
  glGenTextures_(1, @Tex) ;Textur speichern
  
  If TexFilter = 0 ;versch. Textur-Filter
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
    glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
  ElseIf TexFilter = 1
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
    glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
  ElseIf TexFilter = 2
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 4, Width, Height, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
  EndIf
  FreeImage(img)
  ProcedureReturn Tex
EndProcedure
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Dann nimm halt das langsamere wenns bei dir nicht funktioniert:

Code: Alles auswählen

Procedure LoadTexture_(Filename.s, TexFilter.l) ; Returns the texture for an OpenGL application
  img = LoadImage(#PB_Any, Filename.s)
  Width.l=ImageWidth() 
  Height.l=ImageHeight()  
  Size.l=Width * Height
  
  Dim ImageData.b(Size*3)
  
  StartDrawing(ImageOutput())
  For Y=0 To Height-1
    For X=0 To Width-1
     
      Color = Point(X,Y)
      ImageData(i)=Red(Color)
      i+1
      ImageData(i)=Green(Color)
      i+1
      ImageData(i)=Blue(Color)
      i+1
    
    Next
  Next
  StopDrawing()
  
  glGenTextures_(1, @Tex) ;Textur speichern
  If TexFilter = 0 ;versch. Textur-Filter
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
    glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGB, Width, Height, 0, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData()) 
  ElseIf TexFilter = 1
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
    glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGB, Width, Height, 0, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData())
  ElseIf TexFilter = 2
    glBindTexture_(#GL_TEXTURE_2D, Tex)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
    glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
    gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, Width, Height, #GL_RGB, #GL_UNSIGNED_BYTE, @ImageData())
  EndIf
  FreeImage(img)
  ProcedureReturn Tex
EndProcedure
Btw.: Warum steht das in Grafik & Sound Programmierung? Ist das nicht ne PN für mich?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
wasser
Beiträge: 125
Registriert: 27.11.2006 21:16

Beitrag von wasser »

Hallo Darkdragon, wie kann ich jetzt "TransparentColor" in dem Langsamen reinbringen.

Hatte es einfach vom vorigen Programm kopiert, die schwarzen Flächen werden aber nicht durchsichtig (TransparentColor=0), die farbigen Flächen habe jetzt eingenartige Streifenlinien.

MFG
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Antwort gibts per PN. Du hast mir damals ja selbst meinen eigenen Code zugeschickt(Du hast ihn im französischen Forum irgendwo gefunden(k.A. wie der da hin kommt und sogar noch mit französischen Kommentaren))
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten