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

1

09.12.2014, 18:25

[OpenGL]Hilfe bei Projection Matrix!!

Hallo Community,

Ich habe eine Problem mit meiner Projection Matrix die ich mir geschrieben habe.
Momentan zum testen wirt normalerweise ein weißes Dreieck gezeichnet, das Problem ist aber wenn ich nun meine Projection Matrix hinzu füge wird nichts mehr angezeigt.
Die World und View Matrix werden als Indentity an die Shader übergeben und mit den Position-Koordinaten Multipliziert soweit funktioniert das alles noch doch nur wenn ich jetzt noch die Projection Matrix mit hinzu nehme funktioniert das nicht mehr.
Die Matrix habe ich so geschrieben wie es in einigen Tutorials erklärt wird bsp(ogldev).

Hoffe ihr Könnt mir helfen.

Initialisiert werden die Matrizen so:

C-/C++-Quelltext

1
2
3
    view.InitIdentity();
    identity.InitIdentity();
    projection.InitPerspectiveProjection((float)800 / (float)600, 70.0f, 0.1f, 1000.0f);


Hier mal mein Code für die Matrix:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    void Matrix4f::InitPerspectiveProjection(float ar, float fov, float znear, float zfar)
    {
        float tanHalfFOV = tanf(TO_RADIAN(fov / 2));
        float zRange = znear - zfar;

        m[0] = 1.0f / (tanHalfFOV * ar);           m[4] = 0.0f;            m[8] = 0.0f;                  m[12] = 0.0f;
        m[1] = 0.0f;                     m[5] = 1.0f/tanHalfFOV;       m[9] = 0.0f;                      m[13] = 0.0f;
        m[2] = 0.0f;                     m[6] = 0.0f;              m[10] = (-znear - zfar) / zRange;  m[14] = 2 * zfar * znear / zRange;
        m[3] = 0.0f;                     m[7] = 0.0f;              m[11] = 1.0f;                     m[15] = 0.0f;
    }

Funktion zum Rendern

C-/C++-Quelltext

1
2
3
4
5
    shader->BindShader();

    buffer->Draw();

    InitializeShaderComponents(identity.m, view.m, projection.m);



Funktionen für die Übergabe der Uniform variable

Shader-Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
bool ShaderClass::addUniform(char* uniformName, float* mat)
{
    unsigned int Location;

    Location = glGetUniformLocation(m_program, uniformName);
    if(Location == -1)
    {
        return false;
    }
    glUniformMatrix4fv(Location, 1, false, mat);

    return true;
}


Graphics-Klasse

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool GraphicsClass::InitializeShaderComponents(float* world, float* view, float* projection)
{
    bool result;

    result = shader->addUniform("world", world);
    if (!result)
    {
        return false;
    }
    result = shader->addUniform("view", view);
    if (!result)
    {
        return false;
    }
    result = shader->addUniform("projection", projection);
    if (!result)
    {
        return false;
    }


    return true;
}


Gruß DevShadownight

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

2

09.12.2014, 20:04

Wieso verwendest du eigentlich nicht GLM? Diese Header-only Library wurde für OpenGL gemacht und ist objektorientiert, schnell und kongruent zum GLSL Standard.
Diese Lib definiert auch Methoden zum errechnen der Projection, View und World Matrix.

Ansonsten, versuch doch mal deine Matrix zu transponieren.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

3

09.12.2014, 20:43

Erstmal danke für die schnellen Antworten.

Also die Spaltenschreibweise ist die richtige weil ich habe das vorher auch immer benutzt und da ging es bisher immer der einzige Unterschied ist das ich auf das Rechtshänder-Koordinatensystem umgestiegen bin.

Das Transposen hat leider auch nicht funktioniert.

GLM benutze ich nicht weil ich eigentlich keine API´s benutzen möchte sondern am liebsten alles selber schreiben und für die Vektoren und Matrizen Berechnungen habe ich schon einiges geschrieben.
Mein ihr denn das die Berechnungen für die Projections Matrix richtig sind?
Weil bisher haben alle Matrizen wie z.B Rotation, Translation, Scale einwandfrei funktioniert das ist nur die Projection die Probleme macht.

Aber falls nichts helfen sollte werde ich mich mal mit GLM auseinander setzten :).

Gruß DevShadownight

FSA

Community-Fossil

  • Private Nachricht senden

4

09.12.2014, 21:48

GLM benutze ich nicht weil ich eigentlich keine API´s benutzen möchte sondern am liebsten alles selber schreiben und für die Vektoren und Matrizen Berechnungen habe ich schon einiges geschrieben.

Zitat von »Wikipedia«


Das Rad neu erfinden[Bearbeiten]
→ Hauptartikel: Not-invented-here-Syndrom
Mit das Rad neu erfinden (englisch Reinventing the wheel bzw. Not-invented-here-Syndrom) wird die stetige Neuerstellung von Software – ohne bestehende Lösungen oder Frameworks zu nutzen – bezeichnet. Da keine Wiederverwendung erfolgt, erhöht sich der Entwicklungsaufwand, was zu unreifer und teurer Software führt.

Das quadratische Rad neu erfinden[Bearbeiten]
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

5

11.12.2014, 17:09

Naja habe jetzt einfach GLM benutz und es funktioniert.

Werde die API wohl weiterhin benutzen.

Aber danke trotzdem für eure Antworten.

Gruß DevShadownight

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

6

13.12.2014, 13:57

FSA: Ich habe mir auch meine eigenen Matheklassen geschrieben und nicht nur funktionieren sie großartig und auch schnell, sondern ich habe vor allem auch sehr viel dabei gelernt. "Das Rad neu erfinden" halte ich oft für sinnvoll, wenn es nicht darum geht schnell und möglichst gut etwas fertig zu bekommen sondern just for fun an einem Projekt zu basteln mit dem Hauptziel dabei etwas zu lernen.

Was das Problem hier mit der Projektionsmatrix angeht: Ich denke das Vorzeichen vor m[10], m[11] und m[14] ist falsch, wobei das auch von allen anderen Transformationen abhängt und dem genutzten Koordinatensystem, bzw hängen diese von der Projektionsmatrix ab...

FSA

Community-Fossil

  • Private Nachricht senden

7

13.12.2014, 21:56

und auch schnell,

Hast du es mit anderen Verglichen?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

8

14.12.2014, 00:00

Zugegeben nein, aber es ist schnell genug, soll heißen, beim Profilen ist es bisher nie aufgetaucht. Ist größtenteils inzwischen auch SIMD optimiert.

9

14.12.2014, 19:53

SlinDev: Jetzt wo du das mit der Abhängigkeit der Matrizen sagst, habe ich herausgefunden das die Projection Matrix nur funktioniert in zusammenhang mit der View Matrix.
Und zu dem Thema "Das Rad neu erfinden" sehe ich das genau so wie du.

Zusätzlich finde ich solche Post einfach nur unnötig da sie ein bei seinem Problem nicht wirklich hilft, zu mal ich auch geschrieben hatte das ich GLM benutzen werde wenn das weiterhin nicht funktioniert also hätte man sich das sparen können.

Gruß DevShadownight

FSA

Community-Fossil

  • Private Nachricht senden

10

14.12.2014, 21:52

Zusätzlich finde ich solche Post einfach nur unnötig da sie ein bei seinem Problem nicht wirklich hilft,

Solche Posts geben dir Tipps im Entwickeln für später. Irgendwann wirst du es verstanden haben.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige