PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein kleines Problem mit OpenGL....


Metal Maniac
2004-05-10, 14:09:17
Hallo,

ich möchte ein Gebilde zeichnen, das aus 4 Terrain-Gittern zusammengesetzt ist. Ich verwende dazu 'ne Display List. Der Code hierzu sieht in etwa so aus:


GLuint display_list;
glNewList(display_list, GL_COMPILE);

glColor3f(1.0f, 1.0f, 1.0f);

for (int l = 0; l < 4; l++)
{
for (int j = 0; j < terrain_size; j++)
{
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLE_STRIP);

for (int i = 0; i <= terrain_size; i++)
{
glNormal3f(normals[l][i][j].x, normals[l][i][j].y, normals[l][i][j].z);
glVertex3f(vertices[l][i][j].x, vertices[l][i][j].y, vertices[l][i][j].z);
glNormal3f(normals[l][i][j+1].x, normals[l][i][j+1].y, normals[l][i][j+1].z);
glVertex3f(vertices[l][i][j+1].x, vertices[l][i][j+1].y, vertices[l][i][j+1].z);
}

glEnd();
}
}

glEndList();


Wenn ich glColor3f an der roten Position hinsetze (bzw. vor dem Aufruf der Display List ausführe), dann zeichnet mir OpenGL im Wireframe vereinzelt seltsame Verbindungslinien zwischen dem oberen und unteren Rand der einzelnen Terrain-Gitter (die Gitter selber werden korrekt gezeichnet). Positioniere ich glColor3f an der blauen Stelle, dann wird alles korrekt gezeichnet, also diese komischen Linien fehlen. Kann sich jemand 'nen Reim drauf machen?

Als IDE verwende ich Visual Studio 6.0.

MeLLe
2004-05-10, 15:19:24
Ein, zwei Screenshots wären gaaanz toll ;)

Ist sonst etwas schwer vorstellbar, was Du meinst ...

Metal Maniac
2004-05-10, 16:08:27
Ist nicht ganz einfach, da das Terrain zufällig erstellt wird, und alles umzustrukturieren ist zu aufwendig, außerdem sieht man es am besten in Bewegung... aber ich hab's mal probiert:

http://people.freenet.de/dralkir/misc/wireframe.gif

Ich hab' zwecks Übersichtlichkeit nur 1 Terraingitter darstellen lassen. Was noch lustig ist: Wenn ich die Komplexität auf ein gewisses Maß erhöhe (ab Gittergröße 17x17), wird es, egal wo ich glColor3f hinschreibe, wieder richtig gerendert... also, ich werd' da absolut nicht schlau draus... wenn alles nicht hilft, muss ich halt glColor3f innerhalb der 2. For-Schleife stehenlassen (allerdings ungern, da ich die Farbe dann nicht dynamisch ändern kann).

zeckensack
2004-05-10, 17:18:42
Original geschrieben von Metal Maniac
Hallo,

ich möchte ein Gebilde zeichnen, das aus 4 Terrain-Gittern zusammengesetzt ist. Ich verwende dazu 'ne Display List. Der Code hierzu sieht in etwa so aus:


GLuint display_list;
glNewList(display_list, GL_COMPILE);Unfein :)
Lieber so:

GLuint display_list=glGenLists(1);
glNewList(display_list, GL_COMPILE);

Ansonsten ist's IMO ein Treiber-Bug. Die Position von Color3f darf keine Rolle spielen, wenn alles so funzt wie es soll. Was verwendest du so (Graka/Treiberversion)?

Metal Maniac
2004-05-10, 18:06:20
Original geschrieben von zeckensack
[...]
Lieber so:

GLuint display_list=glGenLists(1);
glNewList(display_list, GL_COMPILE);

Ansonsten ist's IMO ein Treiber-Bug. Die Position von Color3f darf keine Rolle spielen, wenn alles so funzt wie es soll. Was verwendest du so (Graka/Treiberversion)?

Jo, danke, aber das mit glGenLists hab' ich schon drinnen, sonst krieg' ich ja keine g'scheite ID für die Liste. Hab's nur in dem angegebenen Code-Fragment vergessen hinzuschreiben :).

Ich vermute auch langsam, dass es ein Treiberproblem ist... denn ich habe vor kurzem eine Radeon 9800Pro gekauft, die meine GeForce 3 abgelöst hat. Auf der GeForce hätte mir das eigentlich schon auffallen müssen, hab' das Programm ja schon längere Zeit, und an dem Code für die Visualisierung habe ich seit ca. 3 Monaten nichts mehr geändert. Hundertprozentig sicher bin ich mir da halt nicht (hätte damals wohl detaillierte Screenshots machen sollen...).

Als Treiber verwende ich momentan Catalyst 4.4. Ein Freund von mir hat es allerdings auch ausprobiert (hat 'ne GeForce FX 5700) und der hat die Striche auch drinnen.

Ich habe schon mal ein Problem mit der neuen Grafikkarte gehabt, nämlich bei der Skybox in meinem Programm. Bei der neuen Karte hatte die Skybox "Nahtstellen", was an GL_CLAMP beim Erstellen der Texturen gelegen hat. Die alte GeForce schien das irgendwie intern als GL_CLAMP_TO_EDGE zu interpretieren. Aber dieses Problem konnte ich wenigstens lösen, indem ich das entsprechend bei den Textur-Parametern abgeändert habe. Jedoch dieses neue Problem ist seltsam... vor allem, da die zusätzlichen Linien nur im Wireframe auftauchen, wären das komplette Polygone, würde man die bei PolygonMode GL_FILL sehen, was aber nicht der Fall ist...

zeckensack
2004-05-10, 18:14:37
Original geschrieben von Metal Maniac
<...>
Jedoch dieses neue Problem ist seltsam... vor allem, da die zusätzlichen Linien nur im Wireframe auftauchen, wären das komplette Polygone, würde man die bei PolygonMode GL_FILL sehen, was aber nicht der Fall ist... Nicht zwingend. Sie würden höchstwahrscheinlich vom Z-Buffer gekillt werden.
Hast du Culling an?
Oder versuch mal unterschiedliche Polygonmodes für FRONT und BACK, damit du genauer siehst, was da eigenltich abgeht.
zBglPolygonMode(GL_FRONT,GL_LINES);
glPolygonMode(GL_BACK,GL_FILL);Z-Test dafür bitte aktivieren, Culling deaktivieren.

Metal Maniac
2004-05-10, 18:31:17
Original geschrieben von zeckensack
Nicht zwingend. Sie würden höchstwahrscheinlich vom Z-Buffer gekillt werden.
Hast du Culling an?
Oder versuch mal unterschiedliche Polygonmodes für FRONT und BACK, damit du genauer siehst, was da eigenltich abgeht.
zBglPolygonMode(GL_FRONT,GL_LINES);
glPolygonMode(GL_BACK,GL_FILL);Z-Test dafür bitte aktivieren, Culling deaktivieren.

Hab' ich schon alles ausprobiert, hab' auch das Terraingitter mal per Blending gezeichnet (Culling aus). Die Linien treten nur bei GL_LINE auf und gehören nicht zu den Polygonen, die werden korrekt gezeichnet.

Metal Maniac
2004-05-11, 12:19:24
So, ich hab's jetzt auf einem Rechner ausprobiert, der 'ne Voodoo 3 Karte drin hat, und da taucht der Fehler nicht auf. Außerdem habe ich doch noch ein paar alte Screenshots von dem Prog gefunden, die ich gemacht habe, als ich die GeForce 3 noch verwendet hatte. Dort sind auch keine zusätzlichen Linien zu sehen. Scheint tatsächlich was mit den neuen Karten bzw. deren Treibern zu tun zu haben (tritt ja auf 'ner Radeon 9800Pro und auf 'ner GeForce FX 5700 auf). Oder gibt es da vielleicht etwas das man im Speziellen bei Display-Lists und neuen Grafikkarten beachten soll?