Skocz do zawartości

[Delphi][OpenGL] Koordynaty tekstur


Brainer

Polecane posty

Witam. :)

 

Po raz kolejny mam problem. Otóż mam taki kodzik:

 

procedure TMainForm.DoRenderTerrain;
const
 VertPos: arrayH^VWH]HH


K
JK
KJK
K
Jf ĆćvCfW'F6W3'&ł5bEfW'FW((IQą(IQąĄX2, V3: Integer);
 var
   Normal: TVertex;
 begin
   Norm[HXX
XXX
XWKX5c%fV7F%7V'G&7BfW'F6W5c%fW'F6W5c59ąYŃĄ9((ą9Ą9ąlt(glBegin(GL_TRIANGLE_STRIP);
     glVertex3fv(@Vertices[V1][JN^XVJN^fW'F6W5c5łvVćBVćCŚ&Vvf\"ŁF5IąŃź(hŃź5IąŃź(   begin
     for I := 0 to 3 do
     begin
       VerticWVHH

WVJHX][
X^NfW'F6W5ł%ŁfW'E5ł&W6WF5M(YŃm%ult5Ńm`ŹYŃAm%ul, Z + VertPos[i][1]]
     end;
     RenderTriangle(0, 1, 3N[X[JKĘN[[

 

Dodam od razu, że nie jestem jego autorem, a jedynie troszkę go przerobiłem. :P

 

Problemem jest nakładanie tekstury na tak wyrenderowany teren. Eksperymentowałem z różnymi ustawieniami koordynat, ale i tak teren wygląda trochę dziwnie.

 

Chciałbym was prosić też o podanie lepszego rozwiązania na renderowanie terenu, bo ten kod przedstawiony przeze mnie powoduje, że teren jest strasznie kanciasty.

 

Z góry dzięki za wasz trud i pomoc.

Link do komentarza
Udostępnij na innych stronach

Witam!

 

Pewnie masz na myśli cieniowanie ... widzę ze tu normalne są obliczane z iloczynu wektorowego a to nie dość że powolna metoda to jeszcze trzeba na końcu uśredniać normalne.

Nie pamiętam dokładnie jak się liczyło normalne dla terenu wiem tylko że w perełkach programowania jest ładny opis (trzeba by sprawdzić spis treści bo nie wiem I czy III).

 

Wiem że mało konkretna ta moja odpowiedź ale nie mam tu swojego magicznego lapciaka, znowu piłem odpoczywam na wakacjach

 

Pozdrawiam :)

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

co do textur to ja tu niewidze nic na ten temat w kodzie jaki zapodałeś, wiec nie wiem jaki masz problem.

 

co do kanciastego terenu to rozwiązanie jest proste im więcej pkt kontrolnych (wierzchołków) tym łagodniej wychodzi teren

 

poczytaj najlepiej o krzywych i płaszczyznach Beziera

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

co do textur to ja tu niewidze nic na ten temat w kodzie jaki zapodałeś, wiec nie wiem jaki masz problem.

 

co do kanciastego terenu to rozwiązanie jest proste im więcej pkt kontrolnych (wierzchołków) tym łagodniej wychodzi teren

 

poczytaj najlepiej o krzywych i płaszczyznach Beziera

 

Moją prośbą było podanie sposobu na prawidłowe koordynaty tekstur, więc się nie dziw, że tam nic nie ma. ;)

Link do komentarza
Udostępnij na innych stronach

Masz jedna normalna dla jednego trojkata, a potrzeba jedna normalna dla kazdego wierzcholka (i wlacz cieniowanie) (tez z tym mialem kiedys problem ;p)

 

Dzięki, poprawiłem. :) Ale dalej wygląda źle.

Oto poprawiony kodzik:

 

 var
   Normal: TVertex;
 begin
   Normal := CalcPlaneNX[
XWKXKXJNX6gbć&łv&VvtE$tU2RŁfW'FmXultź5IąŃ(Ą5IąŃYŃces[V1][2]) / MapResolution;
     glTexCoord2f(u, v);
    ^XWVJNHHXVH&W6WFbŁ&W6WFfW'F6W5c%ł%ź5IąŃ(ąQ
Ą(ąYŃ@Vertices[V2][0]);

     u := Vertices[V3][0] / MapResolutiH
X][HXVJHX]vFW6&C&bRbvfW'FW6gbfW'F6W5cult(ą((

Link do komentarza
Udostępnij na innych stronach

to wrzuc rozwiazanie, moze komus sie przyda

 

Wątpię, żeby to było przydatne, ale niechaj będzie. :)

 

A więc tak, napisałem sobie taką klasę:

 { .: TTerrain :. }
 TTerrain = class(TObject)
 protecte]]HX][BZY^H^H6ćvĆSć&3'&b'&bEFW'&fW'FWMąQMąMMą(ą11( GotDisplayList: Boolean;

   procedure DrawManually();
  YHYP]X
]X]X
NYH[7VĆFTć&2&6VGW&R6WE6ŚRrFVvW\"V&(AąąŃ(]Ń!Ą%Ń((   constructor Create(const FileName: String; GridScale: SinHHKX[[N[HHL^T[N6ćvĆRFW7G'V7F\"FW7G&fW'&FS&I((VŹis,\"zZęhft:j(2óĘnbśVŹ\"ruę2u#,\"r'Łz^V7ŚĘĘrdśźŁ<(*k!Łjz+gyŚ(QQYŃ(QQYŃlt Single;
'ćjl^i2ui'
{ TTerrain }

procedure TTerrain.CalculateNormals;
var
 X,KVK]K][YZ[^ĆV6ćvĆSŚ&Vvf\"ŁFVvBÓFf\"Ńź]Ńź((Ylt(Ylt:= 0.0;
     V[2] := 0.0;

     for YY := -1 to 1 do
    Y[Y
H
VH    H
H[
H
VH    ZY
HVF&vWEŁV6PbŹedąŃĄ(ŃŃd(ą(         targetY := Height -1;

       for XX := -1 to 1 doY

H[
VH     
H[&VvbfwCłćBfCvŃŃĄ(ŃŃ``Źa`(ą(            if (X + XX < 0) then
               targetX H[B]HYLNŁVvG5F&vWEF&vWEÓełtYlta` (YltYlted (    end;
     end;

     V[1] := 1 / 3;
     Len := Sqrt(H
H
WH
WH
H
JNY
[    FV&VvełŁełĆVełYltź1(YltYltź1(((Normals[X, Y] := V;
   end;
end;

constructor TTerrain.CreaJ[S[YN[Y[KX[[K^U66ĆS6ćvĆRf $D&FŚ&VvćW&FVB7&VF((YMąYŃąMą(QMąQŃMą(otDisplayList := False;
 GridSize := GridScale;

 try
   TH]XX]J
NTYQ[J[S[YJNĆDg&&F$fćĆ$g&VRVćCŚVćCŃŃQQŃ)(MŃM(ŃisplayList then
   glDeleteLists(DisplayList, 1);

 inheriYJ
N[YHZ[]ÓX[X[NFVvW#r6ćvĆSŚ&VvrŁvGF\"M(!Ą!ĄźM((dŃź!ight -2 do
 begin
   glBegin(GL_TRIANGLE_STRIP);
     forHYLHY[^GFE66ĆRvGFE66ĆRvć&6gbć&ąm`et(ąYŃĄ`M!!ĄŃm`Y] * VScale, Y * GridSize - Hh);

       glTexCoord2f(X / WY
[K
H
JHY
[JNX[ć&5vfW'FW6bw&E6ŚRrĄŃm`dŹtYMą(ĄdŹM!;
     end;
   glEnd();
 end;
end;

procedure TTerrain.LoYP]X
]X]X
NN[YFT'&Ś&Vv&FVf&BŁc#F&C6WE6ŚR&Ń]Ń  Ń!Ą(d      Ń!Ąo 0 do
 begin
   PB := Bitmap.ScanLine[Y];
   for X := 0 ]XYLHZY]XZYLHHWH%2%%2%5scS(
ąąŃ9ą)()QQI
begin
 if GotDisplayList then
   glCallList(DisplayList)
[bY[^SH[ĘJN]Ó7BF7ĆĆ7Bt4RG&tVĆvVćD((Ńą1Q()()Qerrain.SetSize(W, H: Integer);
begin
 Width := W;
 Height H][
ZYYZY
N][
X[2vGFVvBŚVćCwĄśóĄ^#jJ0Ęk:krŚźn'Ł^6zIZĄh',ćui'
procedure TMainForm.DoRenderTerrain;
begin
 glBindTexture(ÓVTWX^
N[]YM
N'&&VćFW\"ŚVćC

 

I to w zasadzie tyle. :) Oczywiście to jest tylko bardzo banalny przykład i można tutaj bardzo wiele dodać, ale do prostych programów sprawdza się wyśmienicie! :D

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...