Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

21

25.03.2011, 22:03

So ich hab das jetzt wieder zum laufen bekommen, mit a_...
Ich muss das aber dringend mal aufräumen, ich komm mit den ganzen Buffern und Shadern und blabliblub ganz durcheinander.

Sollte das so aussehen?


(Link)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (25.03.2011, 22:24)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

25.03.2011, 22:17

C-/C++-Quelltext

1
2
3
4
5
6
            glBindBuffer(GL_ARRAY_BUFFER, m_shaderProgram->getVertexBuffer());
            glVertexAttribPointer(GLint(0), 3, GL_FLOAT, GL_FALSE, 0, 0);
            glBindBuffer(GL_ARRAY_BUFFER, m_shaderProgram->getVertexBuffer());
            glVertexAttribPointer(GLint(1), 3, GL_FLOAT, GL_TRUE, 0, 0);
            glBindBuffer(GL_ARRAY_BUFFER, m_shaderProgram->getFragmentBuffer());
            glVertexAttribPointer(GLint(2), 2, GL_FLOAT, GL_FALSE, 0, 0);

Was genau ist dein FragmentBuffer?
Warum sind deine Texturkoordinaten 3D aber deine Normalen nur 2D?
Warum setzt du normalized für die Texcoords auf GL_TRUE?
Warum verwenden Position und Texcoords die selben Daten (da fehlt wohl das Offset)?

Hat normal_matrix sinnvolle Werte?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

23

25.03.2011, 22:24

Zitat

Was genau ist dein FragmentBuffer?
Warum sind deine Texturkoordinaten 3D aber deine Normalen nur 2D?


Sorry hatte deinen Post nicht gesehen bevor ich meinen geändert habe, also die Buffer waren vertauscht, der FragmentBuffer speichert die Texturkoordinaten.

Zitat

Warum setzt du normalized für die Texcoords auf GL_TRUE?


Das GL_TRUE ist um die Vertices zu normalisieren (a_Normal aus a_Vertex quasi).

Zitat

Warum verwenden Position und Texcoords die selben Daten (da fehlt wohl das Offset)?


Wie gesagt: vertauscht.

Zitat

Hat normal_matrix sinnvolle Werte?


Ja, nach Bild zu urteilen schon, hab sie jetzt nicht ausgegeben, hatte ich aber vorher schon mal gemacht, da war alles soweit in Ordung (soweit ich das beurteilen kann).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

24

25.03.2011, 22:26

Das GL_TRUE ist um die Vertices zu normalisieren (a_Normal aus a_Vertex quasi).

Das tut aber was ganz andres, das macht nur mit Fixkommazahlen wie z.B. Farbwerten Sinn, würd ich bei float Werten auf jeden fall immer auf GL_FALSE setzen ;)

Wie berechnest du die normal_matrix denn?

Das Bild schaut mir immer noch aus als ob du keine richtigen Normalen hättest sondern einfach die Vertexkoordinaten verwenden würdest (überleg mal, wenn das Licht von rechts oben scheint sollten doch beide Tragflächen relativ stark beleuchtet sein und nicht nur eine). Wenn es das ist was du willst dann schauts natürlich "richtig" aus...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

25

25.03.2011, 22:30

Na schön, also noch ein Buffer für die Normalen? Oder reicht ein normalize() im Shader?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

25.03.2011, 22:33

Was sollte dir ein normalize() im Shader helfen!? Du musst die Normalen erstmal richtig berechnen, dann kannst du sie ja auch schon normalisieren bevor du sie in dein VBO packst. Du brauchst auch nicht unbedingt für jedes Attribut ein eigenes VBO sondern kannst auch alle interleaved in ein VBO packen indem du bei glVertexAttribPointer() entsprechend mit dem stride bzw. pointer (Offset) Arbeitest...

Falls das vorhin irgendwie untergegangen ist: Normalen sind nicht einfach die normalisierten Vertexpositionen sondern eben die Normalvektoren der Oberläche am jeweiligen Vertex. Wenn du nur eine Kugel im Ursprung hast dann entsprechen die Normalvektoren zufällig genau den normalisierten Ortsvektoren. Aber für jeden anderen Fall ist das nicht so.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

27

25.03.2011, 22:35

Gut mach ich Morgen und geb dir dann das Ergebnis für heute reichts :)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

28

26.03.2011, 15:29


(Link)


Sollte das so aussehen?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main(void){        
    vec4 fColor = material_ambient*light0.ambient;
    
    vec3 N = normalize(normal_matrix*a_Normal);
    vec3 L = normalize(light0.position).xyz;
    float NdotL = max(dot(N, L), 0.0); // Winkel zwischen Vertexnormale und Lichtposition
    vec4 pos = modelview_matrix*a_Vertex;
        
    if(NdotL > 0.0){
        fColor += material_diffuse*light0.diffuse*NdotL;
        
        // Spekularlicht
        vec3 E = -pos.xyz;
        vec3 HV = normalize(L+E); 
        float NdotHV = max(dot(N, HV), 0.0); 
        fColor += material_specular*light0.specular*pow(NdotHV, material_shininess);
    }
    
    // Ausgabe  
    color = fColor;
    texCoord0 = a_TexCoord0;
    gl_Position = projection_matrix*pos;    
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
glBindBuffer(GL_ARRAY_BUFFER, m_model->getVertexBuffer());
            glVertexAttribPointer(GLint(0), 3, GL_FLOAT, GL_FALSE, 0, 0);

            glBindBuffer(GL_ARRAY_BUFFER, m_model->getNormalBuffer());
            glVertexAttribPointer(GLint(2), 3, GL_FLOAT, GL_FALSE, 0, 0);

            glBindBuffer(GL_ARRAY_BUFFER, m_model->getTexCoordBuffer());
            glVertexAttribPointer(GLint(1), 2, GL_FLOAT, GL_FALSE, 0, 0);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

29

26.03.2011, 15:44

Ja, das schaut schon nach was aus ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

30

26.03.2011, 15:46

Hu, jetzt bin ich aber erleichtert^^ weiter mit Pixel Shader ;)

Werbeanzeige