OpenGL v Delphi4
glDrawElements
Příklad a zdroják ke stažení (470k)
Příkaz "GLDrawElements" načítá předem vytvořená pole barev, texturových koordinací, pozic bodů a
z těchto hodnot renderuje objekty. Pole hodnot se mohou načíst jen jednou a potom se v nekonečné smyčce volá
příkaz "GLDrawElements", čímž se docílí rychlejšího překreslování scény, než u klasické metody renderování přes
příkaz "glBegin() .... glEnd". Pro zajímavost, renderování pomocí příkazu "GLDrawElements" se údajně používá v Quake3.
Jak tedy na to?
Nejdříve si nadefinujeme typy a proměnné.
//pozice bodů
type TVertexPointer = array [0..100] of record
X: TGLFloat;
Y: TGLFloat;
Z: TGLFloat;
end;
//texturova koordinace
type TCoordPointer = array [0..100] of record
S: TGLFloat;
K: TGLFloat;
end;
//indikátor polí
type TIndices = array [0..100] of TGluInt;
var
VertexPointer: TVertexPointer;
CoordPointer: TCoordPointer;
Indices: TIndices;
Teď dosadíme hodnoty do polí.
//pozice bodu 1
VertexPointer[0].X := -1;
VertexPointer[0].Y := 1;
VertexPointer[0].Z := 0;
//texturova koordinace bodu 1
CoordPointer[0].S := 1;
CoordPointer[0].K := 1;
//identifikace bodu 1
Indices[0] := 0;
//pozice bodu 2
VertexPointer[1].X := 1;
VertexPointer[1].Y := 1;
VertexPointer[1].Z := 0;
//texturova koordinace bodu 2
CoordPointer[1].S := 0;
CoordPointer[1].K := 1;
//identifikace bodu 2
Indices[1] := 1;
//pozice bodu 3
VertexPointer[2].X := -1;
VertexPointer[2].Y := -1;
VertexPointer[2].Z := 0;
//texturova koordinace bodu 3
CoordPointer[2].S := 1;
CoordPointer[2].K := 0;
//identifikace bodu 3
Indices[2] := 2;
//druhý trojúhelník
VertexPointer[3].X := -1;
VertexPointer[3].Y := -1;
VertexPointer[3].Z := 0;
CoordPointer[3].S := 1;
CoordPointer[3].K := 0;
Indices[3] := 3;
VertexPointer[4].X := 1;
VertexPointer[4].Y := 1;
VertexPointer[4].Z := 0;
CoordPointer[4].S := 0;
CoordPointer[4].K := 1;
Indices[4] := 4;
VertexPointer[5].X := 1;
VertexPointer[5].Y := -1;
VertexPointer[5].Z := 0;
CoordPointer[5].S := 0;
CoordPointer[5].K := 0;
Indices[5] := 5;
//aktivace polí
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//načtení hodnot do polí
glColorPointer( 4, GL_UNSIGNED_BYTE, 0, @Buffer );
glTexCoordPointer(2, GL_FLOAT, 0, @CoordPointer);
glVertexPointer(3, GL_FLOAT, 0, @VertexPointer);
No a teď stačí volat
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, @Indices);
A je hotovo.
Trochu ještě zkusim rozepsat funkci
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, @Indices);
GL_TRIANGLES-kreslí trojúhelníky. Mohou se použít i další hodnoty (GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP,
GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP, GL_QUADS, GL_POLYGON )
6-počet všech bodů
GL_UNSIGNED_INT-specifikuje datový typ. Jiné hodnoty jsou (GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT)
@Indices-ukazatel na indikátor polí
Tady můžeš mrknout na kus
zdrojáku
Home