PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwischen glBegin() und glEnd()


Einfachkrank
2002-10-30, 18:17:39
Hi,

mich würde mal interessieren wir ihr diese Phase so ablaufen lasst. Wie lasst ihr eure 3D Objekte zwischen glBegin(...) und glEnd() rendern? Dazu hab ich auch noch ein paar Fragen: Ist es möglich, und wenn, ist es sinnvoll nach dem glBegin() in einer Schleife jede Menge Vertices rendern zu lassen? Könnt ihr mir mal ein paar Tips geben, um Speed und optimierung heraus zu holen? :eyes:

MFG Einfachkrank

zeckensack
2002-10-30, 21:54:45
Vertex Arrays :D

struct Vertex
{
float tex_x,tex_y;
float pos_x,pos_y,pos_z;
};

Vertex vertex[3000];

//lade 3000 vertices aus einer Datei ... irgendwie ... und schreibe sie in das array vertex[]

//... und daaaaannn

void
render()
{
glTexCoordPointer(2,GL_FLOAT,sizeof(Vertex),&(vertex[0].tex_x));
glVertexPointer(3,GL_FLOAT,sizeof(Vertex),&(vertex[0].pos_x));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glBegin(GL_TRIANGLES);
for (int i=0;i<3000;++i)
glArrayElement(i);
glEnd();
}

Man kann auch glInterleavedArrays benutzen, um ein paar vordefinierte Vertex-Formate leichter auswählen zu können.

Außerdem ist glArrayElement sicher nicht die beste Wahl, was Performance angeht. glDrawElements ist besser, glDrawRangeElements noch besser, ist aber eine Extension. Beides erspart einem glEnd/glBegin gleich komplett, dafür muß man Indizes liefern.

Einfachkrank
2002-10-30, 22:05:29
Hi,

und noch ne kleine Frage zu den Texturen, ich kenn mich bis jetzt nur mit Standart Texture Mapping aus und noch nicht mit Multitexture Mapping, falls man den Namen rein wörtlich mit dem Inhalt verstehen kann :D
Kann ich zwischen glBegin() und glEnd() auch immer die Texturen ändern und so nach und nach alle meine Polygone runter rendere, zumindest schon mal von einem Objekt? Oder sollte man da andere Vorgehensweisen nutzen?

MFG Einfachkrank

zeckensack
2002-10-30, 22:15:51
Nö, so geht's nicht :bäh:
'Render State' darf nicht innerhalb eines Begin/End-Paares verändert werden. Dadrin darf man nur vertices durch die Gegend schieben.

2.6.3 GL Commands within Begin/End
The only GL commands that are allowed within any Begin/End pairs are the com-mands
for specifying vertex coordinates, vertex color, normal coordinates, and tex-ture
coordinates (Vertex, Color, Index, Normal, TexCoord), the ArrayElement
command (see section 2.8), the EvalCoord and EvalPoint commands (see sec-tion
5.1), commands for specifying lighting material parameters (Material com-mands;
see section 2.13.2), display list invocation commands (CallList and Cal-lLists;
see section 5.4), and the EdgeFlag command. Executing any other GL
command between the execution of Begin and the corresponding execution of End
results in the error INVALID OPERATION. Executing Begin after Begin has already
been executed but before an End is executed generates the INVALID OPERATION
error, as does executing End without a previous corresponding Begin.
Execution of the commands EnableClientState, DisableClientState, Push-ClientAttrib,
PopClientAttrib, EdgeFlagPointer, TexCoordPointer, Color-Pointer,
IndexPointer, NormalPointer, VertexPointer, InterleavedArrays, and
PixelStore, is not allowed within any Begin/End pair, but an error may or may not
be generated if such execution occurs. If an error is not generated, GL operation is
undefined. (These commands are described in sections 2.8, 3.6.1, and Chapter 6.)

Heißt im Klartext

Begin
...
End

Texturen ändern, Blending ändern

Begin
...
End

wieder alles anders

Begin
...
End


Anders ist's aus Optimierungsgründen nicht erlaubt.