Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 16:34

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 17:00 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

ich brauche ein Funktion welche mit von einer belibigen mit glBitmap2D geladenen Textur die Pixelfarben im Bereich 0...1 wiedergibt..

hier mal mein versuch welcher irgendwie nicht hinhauen will...

Code:
function T3DLight.GetColorAtPixel(pX, pY: Single): TVector3f;
var
  p: TglBitmapPixelPosition;
  pixel : TglBitmapPixelData;
begin
 p.X := round(px * lighttexture.Width);
 p.Y := round(py * lighttexture.Height);
 lighttexture.GetPixel(p, pixel);

 result[0] := pixel.Red / high(cardinal);
 result[1] := pixel.Green / high(cardinal);
 result[2] := pixel.Blue / high(cardinal);
end;


das hier hatte ich vorher (würde auch über scanline gehen):
Code:
if bmp.Width>0 then
 c:= bmp.Canvas.Pixels[round(px * (bmp.Width)),round(py * bmp.Height)]
  else
   c:=clBlack;
   result[0] := GetRValue(C) / 255;
   result[1] := GetGValue(C) / 255;
   result[2] := GetBValue(C) / 255;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich vermute mal du musst durch 255 teilen und nicht durch high(cardinal). Ein cardinal hat nämlich laut Google 32bit...was dann bedeuten würde das du durch 4294967295 teilst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 17:10 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
hab ich schon probiert.. haut auch nich hin.. ich hab mal geguckt was da zurückgegeben wird.. da kommen schon zahlen wie 1494220800


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Was haut den jetzt genau nicht hin? Ist das Bild vielleicht nur gespiegelt oder so?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 17:59 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ne irgendie bekomm ich nur rote pixel..

ADD: so sehen die pixel eines beliebigen bildes (S/W) aus 0.930808961391449 0.0196915231645107 0.000388561864383519


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Do Dez 02, 2010 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 04, 2008 23:15
Beiträge: 39
Wohnort: Oberösterreich
Programmiersprache: ObjPas, C, DivASM
Ist zwar schon lange her das ich glBitmap benutzt habe, aber soweit ich noch weiß liefert die GetPixel Funktion die einzelnen Farben nicht in einem definierten Bereich zurück. Sondern Pixelformat abhängig.

Beispielwerte durch die dividiert werden muss:
RGBA8 = R: 255 G: 255 B: 255 A: 255
R5G6B5 = R: 31 G: 63 B: 31

humflo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Fr Dez 03, 2010 08:55 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
naja das ja doof.. dann muss ich ja alle Pixelformate durchgehen...
da wollt ich jetzt lieger ein assigntoBitmap machen, doch das haut auch net hin.. da bleibt die bmp weiss...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glbitmap2d GetPixel
BeitragVerfasst: Fr Dez 03, 2010 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die Pixeldaten haben deswegen ein Cardinal, da dort durchaus auch RGB10A2 Daten enthalten sein können und je nach Anwendungsfall macht es schlicht keinen Sinn die Daten zu transformieren. Denn dadurch geht massiv Zeit flöten. Zu mal es nur in eher wenigen Fällen wirklich Sinn machen würde die Werte immer normalisiert zurück zu geben.

Thmfrnk hat geschrieben:
naja das ja doof.. dann muss ich ja alle Pixelformate durchgehen...

Ach. Ist das so? Das geht auch deutlich einfacher. Und auch ohne wissen zu müssen welches Format vorliegt.

Code:
function T3DLight.GetColorAtPixel(pX, pY: Single): TVector3f;
var
  Pixel: TglBitmapPixelData
begin
  FormatPreparePixel(Pixel, lighttexture.InternalFormat);
  lighttexture.GetPixel(Pos, Pixel);

  result[0] := Pixel.Red / Pixel.PixelDesc.RedRange;
end;


FormatPreparePixel befüllt das Feld PixelDesc von Pixel. Dort zu finden ist dann jeweils die Größe des Wertebereiches und die Position. Also um wie viele Bits es vom Pixelanfang verschoben ist. Damit solltest du in der Lage sein immer Werte zwischen 0 und 1 zu bekommen.

Im übrigen solltest du GetPixel nicht zu oft aufrufen. Es ist zwar schon so leidlich optimiert. Allerdings aufgrund der Fülle der Formate die unterstützt werden müssen hat es prinziepbedingt eine Grenze über die man nicht hinwegoptimieren kann.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 15 Queries | GZIP : On ]