Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 07:28

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 10:11 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo ihr,

ich stelle gerade meinen Code von der Immediate-Zeichen-Methode auf VertexArrays um. Allerdings klappt es noch nicht so, wie ich will.

Immediate:
Code:
glBegin(GL_TRIANGLES);
            {
                for (unsigned j = 0; j < g_faces.size(); ++j)
                {
                    for (unsigned i = 0; i < 3; ++i)
                    {
                        glTexCoord2fv(&g_texcoords[g_faces[j].t[i]][0]);
                        glNormal3fv(&g_normals[g_faces[j].n[i]][0]);
                        glVertex3fv(&g_vertices[g_faces[j].v[i]][0]);

                    }//endfor

                }//endfor
            }
            glEnd();


VertexArrays:
Code:
         glEnableClientState(GL_VERTEX_ARRAY);
         glEnableClientState(GL_NORMAL_ARRAY);
         glEnableClientState(GL_TEXTURE_COORD_ARRAY);

         glVertexPointer(3, GL_FLOAT, 0, &g_vertices[0][0]);
         glNormalPointer(GL_FLOAT, 0, &g_normals[0][0]);
         glTexCoordPointer(3, GL_FLOAT, 0, &g_texcoords[0][0]);


         glDrawElements(GL_TRIANGLES, 3*g_faces.size(),   GL_UNSIGNED_INT, &g_faces[0]);

         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
         glDisableClientState(GL_VERTEX_ARRAY);
         glDisableClientState(GL_NORMAL_ARRAY);


Ich habe beide Ausgaben mal als Screenshot angehängt. Sieht einer von eich bei letzterem Code den Fehler?

PS: Ist C-Code, also nciht wegen dem & wundern ;).


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 10:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du hast ja da ein Array von Arrays. Das liegt normalerweise nicht am Stück im Speicher. glVertexPointer & Co brauchen das aber ein einem zusammenhängenden Speicherbereich. Einfachste Lösung:

Code:
struct Point {
   float x,y,z;
};

Point g_vertices[100];

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 10:41 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Du meinst das alle 3 Arrays direkt hintereinander im Speicher liegen?

Aktuell sind sie so definiert:
Code:
typedef cgmath::vec3<float> vec3;
typedef cgmath::vec2<float> vec2;
typedef cgmath::vec3<unsigned> uvec3;
typedef cgmath::vec3<unsigned> uvec2;

struct face {
    uvec3 v;
    uvec3 n;
    uvec2 t;
};

std::vector<vec3> g_vertices;
std::vector<vec3> g_normals;
std::vector<vec2> g_texcoords;
std::vector<face> g_faces;


PS: Frag mich nicht, warum die im Grundgerüst (von der Uni) vec3<->uvec2 machen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 10:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
wie schaut denn cgmath::vec3<> aus?

Evtl verbraucht das mehr als 12byte speicher? Evtl noch mehr daten als nur X, Y und Z drin..? Virtuelle funktionen..? Irgendwas?


EDIT: Dein glDrawElements.. da am ende der letzte Parameter, da übergibst du einen Array von Faces... wieso das? Da sollte einfach nur ein Index-Array (bestehend aus nur INTs) stehen. Das wird der fehler sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 10:58 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Ich habe gerade folgendes eingebaut:
Code:
         int s = sizeof(g_faces[0]);
         printf("%d", s);

Zurückgeben tut er mir 36.

@Edit: Ist das nicht schon ein zusammenhängendes Array, nur dass es ein bisschen mehr Struktur hat?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 11:11 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Aufgrund des letzten Posts konnte ich es optisch schon einmal verbessern ;).
Code:
glDrawElements(GL_TRIANGLES, 9*g_faces.size(), GL_UNSIGNED_INT, &g_faces[0]);

(9 statt 3)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 11:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Code:
typedef cgmath::vec3<unsigned> uvec2;

2 != 3, Absicht?

Zitat:
Du meinst das alle 3 Arrays direkt hintereinander im Speicher liegen?

Nein, das ist nicht nötig. Ich hatte angenommen dein Array sieht so aus:
Code:
float g_vertices[100][3];


Zitat:
@Edit: Ist das nicht schon ein zusammenhängendes Array, nur dass es ein bisschen mehr Struktur hat?

Das ist der Fehler. Du kannst nicht Position, Normale und Texcoords getrennt indizieren, du darfst nur einen Index angeben.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 12:28 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
So Fehler gefunden - war wieder zu simpel:

Code:
         glEnableClientState(GL_VERTEX_ARRAY);
         glEnableClientState(GL_NORMAL_ARRAY);
         glEnableClientState(GL_TEXTURE_COORD_ARRAY);

         glVertexPointer(3, GL_FLOAT, 0, &g_vertices[0][0]);
         glNormalPointer(GL_FLOAT, 0, &g_normals[0][0]);
         glTexCoordPointer(2, GL_FLOAT, 0, &g_texcoords[0][0]);

         glDrawElements(GL_TRIANGLES, 9*g_faces.size(), GL_UNSIGNED_INT, &g_faces[0]);

         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
         glDisableClientState(GL_VERTEX_ARRAY);
         glDisableClientState(GL_NORMAL_ARRAY);


glTexCoordPointer erwartet natürlich eine 2 und keine 3 *autsch*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Kommt glDrawElements wirklich mit diesen Faces klar?
Code:
struct face {
    uvec3 v;
    uvec3 n;
    uvec2 t;
};

Meiner Meinung nach funktioniert das nur wenn ein Face direkt ein uvec3 ist. Mich wundert außerdem das für die Texturen nur ein uvec2 da ist, obwohl du ja für ein Dreieck drei Sätze von je zwei Texturkoordinaten brauchst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 12:54 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Coolcat hat geschrieben:
Kommt glDrawElements wirklich mit diesen Faces klar?

Scheint so. Zu mindestens ist die Ausgabe korrekt und der Performanceunterschied deutlich zu spüren :).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 13:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ich vermute ganz stark das du sehr viele doppelte faces hast.
Zwar sind da auch die dabei die du brauchst damit es korrekt aussieht, aber deine 3 Normalen und 3 UV-Indices erzeugen ebenfalls ein Triangle, diese dürften sich entweder perfekt mit deinen decken oder das innere deiner Sphere schaut sehr lustig aus :)

Schau dir das ganze mal im Wireframe an.

Damit es korrekt ist, mußt du bei deinem face-struct die Normalen und UV Index'e weglassen. OpenGL kann leider nur einen Index der für alles (Vertex, Normal, UV, Color etc) gilt.. nicht einen einzelnen für jedes. Sprich wenn ein Vertex 2 verschiedene UV Koordinaten hat, mußt du es doppelt speichern.

Aya

PS @Coolcat: Seine UVs sind zwar als uvec2 deklariert, aber uvec2 ist als vec3<unsigned> deklariert.. sprich es ist eigentlich ein uvec3.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
PS @Coolcat: Seine UVs sind zwar als uvec2 deklariert, aber uvec2 ist als vec3<unsigned> deklariert.. sprich es ist eigentlich ein uvec3.

Ah...ja, dann sind entweder die Indices für Positionen, Normalen und Texturkoordinaten sowieso gleich und es wird einfach alles dreifach gezeichnet, oder wie Aya schon sagte...das innere deiner Sphere sieht lustig aus. ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 13:55 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Aya hat geschrieben:
Schau dir das ganze mal im Wireframe an.

Wo muss
Code:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

rein?

Wenn ich es direkt vor meinem Code mache, rendert OpenGL ab da nichts mehr :(.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Umstellung auf VertexArrays
BeitragVerfasst: Di Jun 15, 2010 14:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Sollte eigentlich klappen wenn du es einfach direkt vor das glDrawElements packst.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.018s | 16 Queries | GZIP : On ]