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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

25.03.2011, 18:13

Meine Frage anders ausgedrückt: Wie definierst du die Vertices und Normalen, bzw. wie übergibtst du sie an den Shader!?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

25.03.2011, 21:27

C-/C++-Quelltext

1
2
3
4
5
6
7
glGenBuffers(1, &m_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*m_interpolatedFrame.vertices.size(), &m_interpolatedFrame.vertices[0], GL_DYNAMIC_DRAW);
        
    glGenBuffers(1, &m_texCoordBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*m_texCoords.size(), &m_texCoords[0], GL_STATIC_DRAW);


Matrizen transformieren...
Shader einlesen, compilieren usw...

Rendern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glVertexAttribPointer(GLint(0), 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glVertexAttribPointer(GLint(1), 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, m_interpolatedFrame.vertices.size());
        
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);


Die Daten werden aus einer md2 Datei (ist nur für den Anfang) gelesen.
Und wieso in den Shader einlesen? Vergiss dieses a_Vertex und Co, das benutz ich nicht mehr. GLSL hat die Vertexdaten usw. in den Build-In Variablen gl_Vertex, gl_Normal usw. schon drin.

Das steht in meinem Buch als Pipeline:

Vertices and attribute data -> (Vertex transformation -> Lighting -> Texture coordinate generation) -> Clipping -> Rasterization -> (Texturing -> Color calculation) -> Fragment operations -> Framebuffer operations

Wobei die erste klammer durch den Vertex Shader und die zweite durch den Fragment Shader beeinflusst werden. Deswegen gehe ich mal davon aus das der Vertex Shader die Daten aus dem ersten Schritt zieht usw. usw.

Wahrscheinlich kannst du das eh. Aber warum interessiert dich wo ich die Daten herbekomme oder sie einlese? Schließlich wird doch eine (korrekte) Ausgabe erzeugt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

25.03.2011, 21:34

Dem Attribut a_Normal das du an den Index 2 gebunden hast wird dort nirgendwo ein Buffer zugewiesen, klar dass das immer 0 ist und weil ich genau das vermutet hab hats mich interessiert wie du das machst ;)

Die "Built-In" Variablen sind Altlasten, die würd ich nicht benutzen.

Und der Output ist eben nicht korrekt (zumindest nach allem was ich mir aus den Informationen hier zusammenreinem kann). Offenbar denkst du dass ein Normalvektor einfach der normalisierte Ortsvektor des Vertex ist, das ist aber natürlich nicht so, darum schaut die Bleuchtung ja auch so komisch aus. Die Normalvektoren musst du natürlich berechnen (wenn du sie noch nicht hast; geht übers Kreuzprodukt) und in ein VBO stecken...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (25.03.2011, 21:44)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

25.03.2011, 21:38

Naschön :) aber wie binde ich die Attribute an die Buffer?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

25.03.2011, 21:40

Na mit glVertexAttribPointer() wie dus ja schon machst, nur atm eben ausschließlich für Position und Texcoords (denen du die Indices 0 und 1 gegeben hast), für die Normalen hast du das offenbar vergessen...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

25.03.2011, 21:43

Die Normalen hatte ich erst wieder rausgenommen...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

25.03.2011, 21:44

Dann musst du die Beleuchtung aber eben auch wieder rausnehmen, sonst ist klar dass das immer 0 sein wird, bzw. wenn du die Vertexposition als "Normale" nimmst ist klar dass das genau so aussieht wie auf den Screenshots da oben wo eben nur ein Teil vom Modell hell ist, nämlich genau jener Oktant in dem die Ortsvektoren der Vertices in Richtung Lichtquelle schauen...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

18

25.03.2011, 21:45

Öhm nö, die sollen ja nicht raus, ich bastel das jetzt einfach richtig zusammen :) (mit glVertexAttribPointer)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

19

25.03.2011, 21:56

Zitat

nimmst ist klar dass das genau so aussieht wie auf den Screenshots da oben wo eben nur ein Teil vom Modell hell ist, nämlich genau jener Oktant in dem die Ortsvektoren der Vertices in Richtung Lichtquelle schauen...


Das ist ja genial^^ So soll es doch sein :P Der Ambient Faktor ist da nicht draufgerechnet.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

25.03.2011, 21:58

Wenn das ist was du willst dann ok, nur ist das eben nicht was man normalerweise unter Beleuchtung versteht, dafür braucht man richtige Normalen ;)

Werbeanzeige