Jak zamienić punkty na obszar w OpenGL

0

Witajcie,

Mam tablicę punktów, którą wyświetlam w OpenGL

procedure RysujPunkty();
var
  i, j: Integer;
begin
  glPointSize(2);
  for I := 0 to High(Stars)  do
  begin
    glBegin(GL_LINE_STRIP)
    for j := 0 to High(stars[i])  do
    begin
      glColor3ub(Round(stars[i,j].R),Round(stars[i,j].g), Round(stars[i,j].b));
      glVertex3i(stars[i,j].x,stars[i,j].y,stars[i,j].z);
    end;
    glEnd;
  end;
end;

Efekt działania można zaobserwować na załączonym screenie.

Pytanie w jaki sposób wskazane kolorowe punkty połączyć np w trójkąty aby wypełnił się obszar? Chodzi o to aby nie było pustych przestrzeni przy dużym zoomie. Od razu wspomnę, że użycie glBegin(GL_TRIANGLE) nie załatwia tematu bo jak widać rysowany jest punkt po punkcie ale jego współrzędne już nie koniecznie muszą się tak układać (efekt triagle w załączniku). Czytałem, że można to załatwić glDrawElements ale nie do końca umiem sobie z tym poradzić

Będę wdzięczny za wszelką pomoc.

0

Możesz wyrenderować punkty na teksturę i potem właśnie ją wyświetlać.

0

A jesteś w stanie pokazać mi jak?

2

Generalnie:

var Texture: PByte; // wcześniej zarezerwowany obszar pamięci

procedure OnRender;
var I: integer;
    TexPos: PtrUInt;
begin
  for I := 0 to High(Points) do
  begin
    TexPos := PtrUInt(Texture) + (Points[I].X * 4) + ((WindowHeight - Points[I].Y - 1) * WindowWidth * 4);

    PByte(TexPos + 0)^ := Points[I].Color.R;
    PByte(TexPos + 1)^ := Points[I].Color.G;
    PByte(TexPos + 2)^ := Points[I].Color.B;
    PByte(TexPos + 3)^ := $FF; // kanał alfa
  end;

  // i tutaj renderujesz teksturę w OpenGL
end;

Kilka dni temu akurat pisałem coś takiego do gry, którą się aktualnie zajmuję, i u mnie z drobnymi optymalizacjami wygląda to tak: http://pastebin.com/aCNB8beE (korzystam z ZenGL).

0

@Patryk27 dzięki za pomoc. Wstępnie zrobiłem coś takiego. W initOpenGL:

 glEnable(GL_DEPTH_TEST);                
 glDepthFunc(GL_LESS);		          
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
 glEnable(GL_TEXTURE_2D);   
LoadTexture('texture.bmp', MyTextureTex); 

W Draw coś takiego:

  glBindTexture(GL_TEXTURE_2D, MyTextureTex);  
  glBegin(GL_QUAD_STRIP);
  for I := 0 to High(Stars)  do
    for j := 0 to High(stars[i])  do
    begin
      glColor3ub(stars[i,j].R,stars[i,j].g, stars[i,j].b);
      glTexCoord2f(I,j);
      glVertex3i(stars[i,j].x, stars[i,j].y, stars[i,j].z);
    end;
  glEnd;

i efekt jest jak w załączniku. No jest lepiej ale jeszcze nie o to chodziło ...

0

i efekt jest jak w załączniku. No jest lepiej ale jeszcze nie o to chodziło ...

No bo zrobiłeś coś zupełnie innego, niż ja :P
Ty oteksturowujesz wielokąt powstały z gwiazd, a ja chciałem, abyś "narysował" gwiazdy na teksturze i potem wyrenderował prostokąt oteksturowany właśnie nią, który będziesz mógł przybliżać, oddalać etc.

0

Ok ... :)
Więc skoro w MyTextureTex mam już załadowaną bitmapę to jak teraz ją narysować i wyrenderować na niej prostokąt?

0

Nadal nie o to chodzi ;)
Masz wyrenderować prostokąt, który będzie miał teksturę MyTextureTex - tu masz poradnik: https://open.gl/textures

0

Aaaaaa no tak ... teraz załapałem. Jeśli mam np 400x400 moich punktów to rysuję bitmapę:

glBegin(GL_QUAD_STRIP);
  for i:=0 to high(stars) do
  for j:=0 to high(stars[i]) do
  begin
    glTexCoord2f(x*,y*); glVertex3i(stars[i,j].x, stars[i,j].y, stars[i,j].z);
  end;
  glEnd;

gdzie x* i y* to obliczone współrzędne bitmapy odpowiadające moim współrzędnym tak?

2

Blisko, ale nadal nie ;)
Punkty rysujesz na teksturę tak jak podałem w kodzie wyżej, a potem renderujesz dosłownie prostokąt złożony z czterech wierzchołków i przypisujesz mu teksturę, którą wcześniej utworzyłeś.

0

@Patryk27 wielkie dzięki za pomoc. Nie do końca wiem jak zrobić to o czym piszesz jednak udało mi się uzyskać pożądany efekt stosując mały myk. Idealnie nie jest ale na razie wystarczy:

glEnable(GL_BLEND);
for I := 0 to High(Stars) -1  do
begin
  glBegin(GL_QUAD_STRIP);
  for j := 0 to High(stars[i])  do
  begin
    glColor3ub(stars[i,j].R,stars[i,j].g,stars[i,j].b);
    glVertex3i(stars[i,j].x,stars[i,j].y,stars[i,j].z);
    glVertex3i(stars[i+1,j].x,stars[i+1,j].y, stars[i+1,j].z);
  end;
  glEnd;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1