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

Aktuelle Zeit: Mo Jul 14, 2025 19:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [gelöst] 32bit colorpicking
BeitragVerfasst: Fr Dez 09, 2011 22:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
moin

ich hab ne shaderlose colorpicking varriante in meinen editor integriert. ich setze die farbe mit glColor4f(i*fac,k*fac,h*fac,m*fac), wobei fac=1/255, und möchte mit meiner picking-funktion dann i,k,h und m ermitteln (...Terrain[i].Surface[k].Vertex[h,m]).

bis eben war mein surface.vertices noch ein eindimensionales array, und i,k und h ermittel ich immernoch korrekt. jedoch kommt für den alphawert(m) immer 0 raus. ich glaube ich hab das problem erkannt, irgendwas geht alphamäßig schief, jedoch hab ich keine ahnung was ich tun könnte... ich möchte mir ungern was anderes ausdenken ich fand das system bisher super. beim initialisieren fordere ich 32 bit farbtiefe an, glreadpixels läuft mit gl_RGBA...

hier mal meine picking-prozedur, die aber in meinen augen funktionstüchtig zu sein scheint.

Code:
  1. procedure TEditor.Pick(var pI,pK,pH,pM: Integer);
  2. var PixelData: array[0..9] of Longword;
  3.     count,i: Longword;
  4.     pX,pY: Integer;
  5.     r: Longword;
  6.     rv: array[0..3] of byte absolute r;
  7. begin
  8. //Init
  9. count:=0;
  10. r:=0;
  11. pI:=-1;
  12. pK:=-1;
  13. pH:=-1;
  14. pM:=-1;
  15.  
  16. //mauscoords zubereiten
  17. pY:=round(CHEIGHT-mY);
  18. pX:=round(mX);
  19. if pX>0 then if pX<CWIDTH then dec(pX) else dec(pX,2);
  20. if pY>0 then if pY<CWIDTH then dec(pY) else dec(pY,2);
  21.  
  22. //states setzen, rendern, zurück setzen
  23. glClearColor(1.0,1.0,1.0,1.0);
  24. glEnable(GL_SCISSOR_TEST);
  25. glDisable(GL_LIGHTING);
  26.  
  27. glScissor(pX,pY,3,3);
  28. Render(True);
  29.  
  30. glDisable(GL_SCISSOR_TEST);
  31. glEnable(GL_LIGHTING);
  32. glClearColor(0.15,0.15,0.15,0);
  33.  
  34. //pixeldata füllen
  35. glReadPixels(pX,pY,3,3,GL_RGBA,GL_UNSIGNED_BYTE, @PixelData[0]);
  36.  
  37. //zählen ob min 3 gleich
  38. for i:=0 to 9 do
  39.   begin
  40.   if PixelData[i]=PixelData[4] then inc(count);
  41.   if (count>3) then
  42.     begin
  43.     r:=PixelData[4] and $FFFFFF;
  44.  
  45.     //auswerten
  46.     pI:=rv[0];
  47.     pK:=rv[1];
  48.     pH:=rv[2];
  49.     pM:=rv[3];
  50.  
  51.     Exit;
  52.     end;
  53.   end;
  54. end;


jemand ne idee?

edit: evtl nützliche informationen: ich hab ne radeon hd 4870 mit neustem treiber und der alpha test ist aus (ihn nochmals auszuschalten hat nicht geholfen). glGetIntegerv(GL_ALPHA_BITS, @bla) wirft 8 aus.

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Zuletzt geändert von sirrk am Mo Dez 12, 2011 11:15, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 32bit colorpicking
BeitragVerfasst: Sa Dez 10, 2011 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zeig mal die Definiton von surface.vertices.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 32bit colorpicking
BeitragVerfasst: Sa Dez 10, 2011 18:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
hm was meinst du genau? surfaces is n array of array of TVertex, welches n record ist mit position(3f), color(3f) und texcoord(2f). ich geh sie dann nur in der richtigen reihenfolge durch und ruf gVertex3f( etc auf. magst du mir verraten wo du nen fehler vermutest? bisher hat die selektion funktioniert, aber meine surfaces wahren nur n array of vertex die einfach nacheinander als triangle strip gezeichnet wurden.

ps: mein editor zeichnet im imidiatemode und es geht um die selektion von GL_POINTS, die meine vertices representieren. licht, texturen und tiefentest sind aus.

die r g b kanäle funktionieren immernoch. wenn ich

Code:
  1. var r,g,b,a: Integer;
  2. const fac=1/255; rot=1; gruen=2; blau=3; alpha=4;
  3.        
  4. ...
  5. glColor4f(rot*fac,gruen*fac,blau*fac,alpha*fac);
  6. //rendering
  7. ...
  8. pick (r,g,b,a);


aufrufe, bekomme ich
r=1 //=rot
g=2 //=grün
b=3 //=blau
a=0
raus.

a ist nicht wie initialisiert -1, und auch nicht 1, wie bei eig allen googleeinträgen zu dem thema, sondern halt 0.

ich hoffe ich konnte das problem ausreichend bechreiben.

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 32bit colorpicking
BeitragVerfasst: Sa Dez 10, 2011 19:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ah, nevermind. Hab mich vertan, sorry.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 32bit colorpicking
BeitragVerfasst: Sa Dez 10, 2011 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ein 32bit Framebuffer bedeutet nicht das auf auch einen Alpha-Kanal hast. Das Format könnte z.B XRGB sein...d.h. die 8bit des X-Kanals werden einfach nicht genutzt. Leicht schnellerer Speicherzugriff (weil 32bit aligned) gegen mehr Speicherverbrauch....obs wirklich schneller ist muss man ausprobieren...

=> Schau mal ob du irgendwo den Alpha-Kanal explizit aktivieren kannst.

Sofern du irgendwo in deinem Programm mit glColorMask spielst, stelle sicher das du mal glColorMask(true, true, true, true) aufrufst damit auch in alle Farbkanäle geschrieben wird. Das ist die Default-Einstellung.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 32bit colorpicking
BeitragVerfasst: Mo Dez 12, 2011 10:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
ColorMask hat nicht geholfen.

Coolcat hat geschrieben:
=> Schau mal ob du irgendwo den Alpha-Kanal explizit aktivieren kannst.


hm wüsst ich jetzt nicht wie ich das anstelle. glGetIntegerv(GL_ALPHA_BITS, @bla) wirft 8 aus, ist das nicht ein gutes indiz für seine existenz?

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] 32bit colorpicking
BeitragVerfasst: Mo Dez 12, 2011 11:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
hm, die lösung des problems:

r:=PixelData[4];// and $FFFFFF;

$FFFFFF auskommentieren. hm, hm, na hauptsache es funktioniert^^ das hatte ich so aus dem tutorial übernommen, ohne jedoch genau zu wissen was da passiert. interessant finde ich, dass dieser zusatz bei mir nichts zu bewirken scheint als den alpha kanal zu ruinieren. ob das im tutorial so beabsichtigt sein könnte, weiß ich nicht, hab auch die schnauze voll von selektion erstma xD

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] 32bit colorpicking
BeitragVerfasst: Mo Dez 12, 2011 11:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das ist ein gewöhnlicher Bitshift. Du hast aber einfach an der falschen Stelle im Tutorial geschaut, denn den braucht man nur wenn man 24-Bit für die Selektion nutzt. Nutzt man aber die vollen 32-Bit, dann ist der Bitshift logischerweise nicht mehr nötig.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] 32bit colorpicking
BeitragVerfasst: Mo Dez 12, 2011 12:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
okay :) du hast recht, nachdem die selektion mit 24bit lief hab ich nurnochmal den 32 bit teil angeschaut, und als änfänger da nichts finden können. trozdem super tutorial, natürlich! immerhin hab ichs hinbekommen.

wo wär ich ohne euch^^

möge der tag kommen an dem ich n nützliches tutorial schreibe

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] 32bit colorpicking
BeitragVerfasst: Mo Dez 12, 2011 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sascha Willems hat geschrieben:
Das ist ein gewöhnlicher Bitshift. Du hast aber einfach an der falschen Stelle im Tutorial geschaut, denn den braucht man nur wenn man 24-Bit für die Selektion nutzt. Nutzt man aber die vollen 32-Bit, dann ist der Bitshift logischerweise nicht mehr nötig.

Nur eine kleine Klarstellung: Ist kein Bitshift (das wäre shl oder shr), sondern in Bitmask, das die oberen 8 bit (bei dir vermuutlich der Alphakanal) auf 0 setzt.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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.009s | 15 Queries | GZIP : On ]