DGL
https://delphigl.com/forum/

Probleme beim Color Picking
https://delphigl.com/forum/viewtopic.php?f=20&t=9940
Seite 1 von 1

Autor:  Dropye [ Mi Jun 01, 2011 10:35 ]
Betreff des Beitrags:  Probleme beim Color Picking

Hallo,

ich versuche gerade nochmal Color Picking zum laufen zu bringen, allerdings bekomme ich die falschen Werte zurück.

Es scheint als ob ich die Werte bekomme die ich auch sehe, nicht die codierten.

Wenn ich glUseProgram(0); aus der Selekt funktion auskommentiere dann geht alles aber dann seh ich ja die codierten Werte.
Ich häng alle nötigen Code-Schnipsel an vieleicht kann mir ja jemand helfen.

lg

Initialisation:

Code:
  1.   SelShader := TSelShader.Create('Data\Shader\Sel.Shader');
  2.   glUseProgram(SelShader.ProgramObject);
  3.   SelShader.Init;
  4.  
  5.   Map := TMap.Create;
  6.   Map.SetWindow(ClientWidth, ClientHeight);


Code:
  1. procedure TSelShader.Init;
  2. begin
  3.   Color := glGetUniformLocation(ProgramObject, 'color');
  4.   UseAlphaTex := glGetUniformLocation(ProgramObject, 'use_alpha_tex');
  5.   glUniform1i(glGetUniformLocation(SelShader.ProgramObject, 'use_alpha_tex'), 0);
  6.   glUseProgram(0);
  7. end;


Code:
  1. constructor TMap.Create;
  2. var x,y : Integer;
  3. begin
  4.  Count := 0;
  5.  y := 0;
  6.  SetLength(Blocks, 64);
  7.  for x := 1 to 64 do begin
  8.   if y = 4 then y := 0;
  9.   Blocks[x] := TBlock.Create;
  10.   Blocks[x].Pos := SetVec3v(y*2-5,round(x/8)-4,-15);
  11.   Blocks[x].ID := Count;
  12.   Count := Count+1;
  13.   y := y +1;
  14.  end;
  15. end;


Rendern:

Code:
  1. procedure TMap.Render(Sel_Mode : Boolean = false);
  2. const
  3.   fac: single = 1/255;
  4. var
  5.   i: longword;
  6.   iv: array [0..3] of byte absolute i; // iv und i überschneiden sich
  7. begin
  8.   for I := 1 to High(Blocks) do begin
  9.    if Sel_Mode then begin
  10.       {$ifdef ENDIAN_BIG}
  11.       glUniform4f(SelShader.Color, iv[1]*fac, iv[2]*fac, iv[3]*fac, 1.0);
  12.       {$else}
  13.       glUniform4f(SelShader.Color, iv[0]*fac, iv[1]*fac, iv[2]*fac, 1.0);
  14.       {$endif}
  15.    end;
  16.     glLoadIdentity;
  17.     Blocks[i].Render;
  18.   end;
  19. end;


Anmerkung: Der Sel_Mode verhindert ein Error (Der Vorgang ist Ungültig) wenn der shader nicht gebunden ist aber trotzdem werte übergeben werden sollen.

Autor:  Coolcat [ Mi Jun 01, 2011 10:48 ]
Betreff des Beitrags:  Re: Probleme beim Color Picking

Zitat:
Wenn ich glUseProgram(0); aus der Selekt funktion auskommentiere dann geht alles aber dann seh ich ja die codierten Werte.

Das zu zweimal rendern musst weiß du aber, oder? Einmal für die Selektion und einmal damit du was siehst. Ich finde es merkwürdig, dass du für die Selektion scheinbar in den normalen Framebuffer renderst und nicht etwa in einen FBO. Vielleicht fehlt aber auch nur der entsprechende Teil des Quellcodes.

Autor:  Dropye [ Mi Jun 01, 2011 11:49 ]
Betreff des Beitrags:  Re: Probleme beim Color Picking

Ich Rendere 2 mal, 1x so das ich sehe was der Nutzer sehen soll und einmal mit aktivem Shader.

allerdings wird auch im Tutorial nur 1 Renderprocedure verwendet und in den Normalen Buffer geschrieben.

In der Selekt funktion wird nocheinmal Gerendert ohne dies anzuzeigen
Code:
  1.   glUseProgram(SelShader.ProgramObject);
  2.   glClearColor(0.0, 0.0, 0.0, 0.0);
  3.   glEnable(GL_SCISSOR_TEST);
  4.   glScissor(x, y, 3, 3);
  5.  
  6.   Render(true);
  7.   glClearColor(0.1, 0.1, 0.1, 0.0);
  8.   glUseProgram(0);

Autor:  Coolcat [ Mi Jun 01, 2011 12:34 ]
Betreff des Beitrags:  Re: Probleme beim Color Picking

Sag doch das du das Tutorial benutzt:
http://wiki.delphigl.com/index.php/Tuto ... ing_Shader
Dann macht dein Post plötzlich viel mehr Sinn, weil jetzt z.B. klar ist was die "Selekt funktion" sein soll ;)

Also mein Tipp wäre das dein normales Rendering aus irgendeinem Grund kaputt ist. Wäre es beispielsweise möglich das alles was du normal renderst einfach nur schwarz ist? Z.B. weil die Textur die der Color-Picking-Shader benutzt noch gebunden ist. Einfach mal die clearColor auf irgendwas nicht-schwarzes drehen.

Edit:
Noch ne Idee: Der Z-Buffer wird in Render nicht gelöscht! Wenn du das zweite mal renderst verhindert der Z-Buffer das irgendwas passiert, die Z-Werte sind ja identisch. Bau da mal ein
Code:
  1. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);

rein.

Autor:  Dropye [ Mi Jun 01, 2011 15:49 ]
Betreff des Beitrags:  Re: Probleme beim Color Picking

das ist wieder so ein ding wo es mich ärgert das ich seit 3 tagen nicht allein drauf gekommen bin.

genau das hat gefehlt danke dir :)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/