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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

07.01.2013, 14:04

Von was wolltest du denn darauf umsteigen?

Genau genommen von nichts ! Bisher habe ich mir jeden einzelnen Entrypoint selber mit wglGetProcAddress ausgeben lassen.

Nun, dann gibt es eine ganz gute Daumenregel: Wenn es Dir mehr Vorteile als Nachteile bringt umzustellen (z.B. mehr Zeit spart GLEW komplett fertig zu benutzen als die Umstellung an sich dauert), dann stell's um. Wenn die Nachteile (z.B. der nötige Aufwand in Relation zum Nutzen) aus Deiner Sicht überwiegen, lass es bleiben. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

12

07.01.2013, 14:31

Nun, dann gibt es eine ganz gute Daumenregel: Wenn es Dir mehr Vorteile als Nachteile bringt umzustellen (z.B. mehr Zeit spart GLEW komplett fertig zu benutzen als die Umstellung an sich dauert), dann stell's um. Wenn die Nachteile (z.B. der nötige Aufwand in Relation zum Nutzen) aus Deiner Sicht überwiegen, lass es bleiben.

Aufwand für den Umstieg ist nicht das Problem denke ich.
Ich wollte mir nur mal ein paar Meinungen einholen ob das ganze was taugt.
Kann ja sein das jemand damit schon gearbeitet hat und es nicht weiter empfiehlt bzw. was besseres kennt.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

07.01.2013, 15:58

GLEW läuft afaik nur in einem Compatibility Profile Context, da es deprecated Funktioalität benutzt. Ich persönlich würd GLEW in einem ernsthaften Projekt nicht benutzen. Was verwendest du momentan und was genau ist der Grund aus dem zu gerade zu GLEW umsteigen willst?

14

07.01.2013, 23:15

Naja, du kannst ja mal einfach ein paar ExtensionHandler unter die Lupe nehmen. Der Code ist in der Regel trivial, es werden halt nur irgendwie massig globale Funktionszeiger gesetzt. Schau dir einfach an, was dir davon am besten gefällt und nehm das dann. glLoadGen fand ich eigentlich ganz ok, das hat sogar mehrere Ausgabestile, unter anderem einen, der alle OpenGL Funktionen in einen C++ Namespace packt, also statt glDoSomething gl::DoSomething. Wer sowas geil findet, mag es benutzen, Problem ist natürlich, dass du dann nicht später auf eine andere Extensionbibliothek umsteigen kannst, was sonst in der Regel recht leicht ist.
Lieber dumm fragen, als dumm bleiben!

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

15

08.01.2013, 00:13

Was verwendest du momentan und was genau ist der Grund aus dem zu gerade zu GLEW umsteigen willst?

Hatte ja schon gesagt das ich mir die Entrypoints immer selber besorgt habe. Das ist naturlich Mühsam weil man für jede neue Funktion erst mal einen neuen Zeiger definieren muss.
Ich dachte halt die Arbeit kann man sich sparen indem man sowas wie GLEW benutzt das einem schon alle Zeiger bereitstellt.

der alle OpenGL Funktionen in einen C++ Namespace packt, also statt glDoSomething gl:oSomething

Genauso sah meine Mechanik auch aus. Nur das ich eine Klasse GL hatte mit jeder Menge statischer Funktionszeiger.

Es ist jetzt auch zu Spät, habe heute auf GLEW umgestellt und sofort Scheiße !!! mein 2D OpenGL LOGO wird nicht mehr gerendert.
Bin mit gDEbugger ran und kann mir das einfach nicht erklären ...
Dieser Einfache Code hat bisher tadellos funktioniert.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
void CLogo::Draw(int nScreenWidth, int nScreenHight, int nLogoPosX, int nLogoPosY, int nLogoWidth, int nLogoHight)
{
    CVector2 Vertex[6];
    CVector2 Texture[6];
    float fX1 = 2.0f * (float)nLogoPosX / (float)nScreenWidth - 1.0f;
    float fY2 = 1.0f - 2.0f * (float)nLogoPosY / (float)nScreenHight;
    float fX2 = fX1 + (float)nLogoWidth * 2.0f / (float)nScreenWidth;
    float fY1 = fY2 + (float)nLogoHight * 2.0f / (float)nScreenHight;

    // triangle 1
    Vertex[0] = CVector2(fX1,fY1);
    Vertex[1] = CVector2(fX1,fY2);
    Vertex[2] = CVector2(fX2,fY2);

    // triangle 2
    Vertex[3] = CVector2(fX1,fY1);
    Vertex[4] = CVector2(fX2,fY2);
    Vertex[5] = CVector2(fX2,fY1);

    // texture trianngle 1
    Texture[0] = CVector2(0.0f, 1.0f);
    Texture[1] = CVector2(0.0f, 0.0f);
    Texture[2] = CVector2(1.0f, 0.0f);

    // texture trianngle 2
    Texture[3] = CVector2(0.0f, 1.0f);
    Texture[4] = CVector2(1.0f, 0.0f);
    Texture[5] = CVector2(1.0f, 1.0f);

    glBindBuffer(GL_ARRAY_BUFFER, m_unVBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) + sizeof(Texture), NULL, GL_DYNAMIC_DRAW);

    glBufferSubData(GL_ARRAY_BUFFER, 0,              sizeof(Vertex),  Vertex);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(Vertex), sizeof(Texture), Texture);

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)sizeof(Vertex));

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindTexture(GL_TEXTURE_2D, m_unTexture);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glEnable(GL_BLEND);

    glDrawArrays(GL_TRIANGLES, 0, 6);
    
    glDisable(GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, 0);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, 0);   
}

Jetzt bekomme ich GL_INVALI_OPERATION an dieser Stelle ...

C-/C++-Quelltext

1
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);

Ich habe keine Ahnung was hier das Problem ist.
Wenn jemand eine Idee hat wäre ich dankbar.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

16

08.01.2013, 13:02

Jetzt wird es völlig abstrus. Wenn ich einen VAO binde funktioniert das VBO setup auf einmal ... ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?(

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
void CLogo::Draw(int nScreenWidth, int nScreenHight, int nLogoPosX, int nLogoPosY, int nLogoWidth, int nLogoHight)
{
    CVector2 Vertex[6];
    CVector2 Texture[6];
    float fX1 = 2.0f * (float)nLogoPosX / (float)nScreenWidth - 1.0f;
    float fY2 = 1.0f - 2.0f * (float)nLogoPosY / (float)nScreenHight;
    float fX2 = fX1 + (float)nLogoWidth * 2.0f / (float)nScreenWidth;
    float fY1 = fY2 + (float)nLogoHight * 2.0f / (float)nScreenHight;

    // triangle 1
    Vertex[0] = CVector2(fX1,fY1);
    Vertex[1] = CVector2(fX1,fY2);
    Vertex[2] = CVector2(fX2,fY2);

    // triangle 2
    Vertex[3] = CVector2(fX1,fY1);
    Vertex[4] = CVector2(fX2,fY2);
    Vertex[5] = CVector2(fX2,fY1);

    // texture trianngle 1
    Texture[0] = CVector2(0.0f, 1.0f);
    Texture[1] = CVector2(0.0f, 0.0f);
    Texture[2] = CVector2(1.0f, 0.0f);

    // texture trianngle 2
    Texture[3] = CVector2(0.0f, 1.0f);
    Texture[4] = CVector2(1.0f, 0.0f);
    Texture[5] = CVector2(1.0f, 1.0f);

    glBindVertexArray(m_unVAO);
    {
        glBindBuffer(GL_ARRAY_BUFFER, m_unVBO);

        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) + sizeof(Texture), NULL, GL_DYNAMIC_DRAW);

        glBufferSubData(GL_ARRAY_BUFFER, 0,              sizeof(Vertex),  Vertex);
        glBufferSubData(GL_ARRAY_BUFFER, sizeof(Vertex), sizeof(Texture), Texture);

        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)sizeof(Vertex));

        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);

        glBindTexture(GL_TEXTURE_2D, m_unTexture);
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        glEnable(GL_BLEND);

        glDrawArrays(GL_TRIANGLES, 0, 6);
        
        glDisable(GL_BLEND);
        glBindTexture(GL_TEXTURE_2D, 0);

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }
    glBindVertexArray(0);
}
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

08.01.2013, 13:11

Was für eine Art von OpenGL Context verwendest du? Evtl. müsstest du noch glEnableClientState(GL_VERTEX_ARRAY) aufrufen!?

Edit: Ok du verwendest ja generic Vertex Attributes, damit solltest du das nicht brauchen...

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

18

08.01.2013, 13:52

Noch ein Stück Puzzel ...

Mit einem Context <= 3.1 funktioniert es auch ohne VAO.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    GLint attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB,  3,
                       WGL_CONTEXT_MINOR_VERSION_ARB,  1,
                       0 };

    m_hRC = wglCreateContextAttribsARB(m_hDC, 0, attribs);
    if (m_hRC == NULL)
    {
        std::string strMsg;
        strMsg = "Creating OpenGL context failed !";
        throw strMsg;
    }


Mit einem Context >= 3.2 funktioniert es nur mit VAO.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    GLint attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB,  3,
                       WGL_CONTEXT_MINOR_VERSION_ARB,  2,
                       0 };

    m_hRC = wglCreateContextAttribsARB(m_hDC, 0, attribs);
    if (m_hRC == NULL)
    {
        std::string strMsg;
        strMsg = "Creating OpenGL context failed !";
        throw strMsg;
    }


?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?( ?(
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

08.01.2013, 15:41

Das Default VAO wurde in OpenGL 3.0 deprecated und in OpenGL 3.1 removed, die entsprechenden Calls erzeugen ab hier einen GL_INVALID_OPERATION Error wenn du sie aufrufst ohne dass ein VAO gebunden ist. Ein OpenGL 3.1 Context kann aber wahlweise GL_ARB_compatibility implementieren, was bei deinem Treiber offenbar der Fall ist, weswegen das bei dir mit 3.1 noch funktioniert. Ab OpenGL 3.2 gibt es das Default VAO nur noch im Compatibility Profile, du erzeugst aber einen Core Profile Context und damit funktioniert ohne VAO nichts mehr... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (08.01.2013, 15:46)


stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

20

08.01.2013, 16:43

Das Default VAO wurde in OpenGL 3.0 deprecated und in OpenGL 3.1 removed, die entsprechenden Calls erzeugen ab hier einen GL_INVALID_OPERATION Error wenn du sie aufrufst ohne dass ein VAO gebunden ist. Ein OpenGL 3.1 Context kann aber wahlweise GL_ARB_compatibility implementieren, was bei deinem Treiber offenbar der Fall ist, weswegen das bei dir mit 3.1 noch funktioniert. Ab OpenGL 3.2 gibt es das Default VAO nur noch im Compatibility Profile, du erzeugst aber einen Core Profile Context und damit funktioniert ohne VAO nichts mehr...

Hut ab und vielen Dank :thumbsup:
Wo liest man sowas nach ? Ich habe die 3.2 Spec schon bemüht und auch in den OpenGL.org ref. Pages für 3.3 steht unter glVertexAtributePointer nichts über sowas.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige