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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

27.02.2014, 10:30

[OpenGL 4.0] Problem beim Rendern mit einfachem Shader

Guten Morgen,

ich melde mich seit einiger zeit auch mal wieder zu Wort. Nach dem ich zu Weihnachten OpenGL Superbible bekommen habe wollte ich damit jetzt auch mal wieder ein wenig Programmieren. Nach dem ich leider mit dem erstellen der dazu gehörigen Lib gescheitert bin habe ich mich gleich noch ein wenig mit dem Erstellen eines Fensters und der Windowapi beschäftigt. Das erstellen eines Fensters und das weiß über rendern läuft ohne Probleme.
Doch nun zu meinem Problem. Ich wollte jetzt mit Hilfe von einem einfachen Shader ein Dreieck rendern. Ich habe mich unter anderem an diesem Tutorial orientiert.

Shader http://antongerdelan.net/opengl/shaders.html
Vertexbuffer http://antongerdelan.net/opengl/vertexbuffers.html


Jetzt noch ein wenig Code
Erstellen des Buffers

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
bool GraphicClass::CreateVBO(std::shared_ptr<ObjectClass> Object)
{
    Object->VBO_vertice = 0;
    glGenBuffers(1, &Object->VBO_vertice);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
    glBufferData(GL_ARRAY_BUFFER, Object->vertice.size() * sizeof (GLfloat), &Object->vertice, GL_STATIC_DRAW);
    
        Object->VBO_color = 0;
    glGenBuffers(1, &Object->VBO_color);    
        glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);             
        glBufferData(GL_ARRAY_BUFFER, Object->color.size() * sizeof (GLfloat), &Object->color, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    Object->VAO = 0;
    glGenVertexArrays(1, &Object->VAO); glBindVertexArray(Object->VAO);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    
return true;
}


Erstellen des Shaders

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
bool GraphicClass::NewShader(std::string ShaderName, std::string &VS, std::string &FS)
{
    std::shared_ptr<GraphicClass::ShaderClass> Shader{ new GraphicClass::ShaderClass{ VS, FS } };
    if(!Shader) 
    {
        return false;
    }
    this->Shaders.insert(std::map<std::string, std::shared_ptr<GraphicClass::ShaderClass>>::value_type(ShaderName,Shader)); 
    return true;
}

GraphicClass::ShaderClass::ShaderClass(std::string &VS, std::string &FS)
{
    const char*c_str;
    this->Program = glCreateProgram();

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, &(c_str = FS.c_str()), NULL);
    glCompileShader(fs);
#ifdef _DEBUG
    Print_shader_info_log(fs);
#endif

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, &(c_str = VS.c_str()), NULL);
    glCompileShader(vs);
#ifdef _DEBUG
    Print_shader_info_log(vs);
#endif

    glAttachShader(this->Program, vs);
    glAttachShader(this->Program, fs);

    glBindAttribLocation(this->Program, 0, "vertex_position");
    glBindAttribLocation(this->Program, 1, "vertex_colour");
    glLinkProgram(this->Program);
#ifdef _DEBUG
    Print_programme_info_log();
    Logfile.log("Shader wurde erstellt", this->Program);
#endif
}


Das Rendern

C-/C++-Quelltext

1
2
3
4
5
6
7
void GraphicClass::WindowClass::Render(std::shared_ptr<ObjectClass> Object, GLint Shader) const
{
    wglMakeCurrent(this->DC, this->renderingContext);
    glUseProgram(Shader);
    glBindVertexArray(Object->VAO);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}


Ich kann natrürlich auch alles andere an Quellcode zur verfügung stellen
Ich bedanke mich jetzt schon einmal

EDIT:
Jetzt kann man auch den Code lesen :D
Hier noch einmal die Shader

Quellcode

1
2
3
4
5
6
7
8
9
10
layout(location = 0) in vec3 vertex_position;
layout(location = 1) in vec3 vertex_colour;

out vec3 colour;

void main ()
{
  colour = vertex_colour;
  gl_Position = vec4 (vertex_position, 1.0);
}

Quellcode

1
2
3
4
5
6
7
8
]
in vec3 colour;
out vec4 frag_colour;

void main ()
{
  frag_colour = vec4 (colour, 1.0);
}

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Volker_Neff« (28.02.2014, 12:56)


Techie

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

2

27.02.2014, 10:47

Was ist den genau dein Problem?
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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

27.02.2014, 11:10

Habe ich das nicht gesagt?
das ist dann natürlich ungeschickt. Ich möchte das ein Dreieck im Fenster erscheint. Also das der Shader läuft. Laut der Debugausgabe von OpenGl gibt es keine Shaderprobleme und es wird alles übersetzt. Jedoch sehe ich nichts und das ist schade
Ich bedanke mich schon einmal

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

27.02.2014, 11:36

Im ersten Code Abschnitt (Zeile 7) bindest du den Vertices Buffer erneut statt den vprher erstellten Color Buffer.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

5

27.02.2014, 11:48

Danke ich habe es bearbeitet, und auch oben editirt aber leider war es nicht die Lösung für mein Problem, des screen bleibt weiß.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

6

28.02.2014, 10:55

Ich möchte noch einmal auf mein Problem aufmerksam machen.
Laut gDEBugger sind die Buffer mit merkwürdigen Daten gefüllt.
Aus den Positionen

Quellcode

1
this->Object->vertice = std::vector<GLfloat>{0.0f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f};

wird

Quellcode

1
2
3
4.6095096e-039, 4.6096105e-039, 4.609661e-039, 
4.609661e-039, 4.4591559e-039, 4.6097451e-039, 
4.6097955e-039, 4.6097955e-039, 1.4012985e-045,

Und das gleiche Problem habe ich mit den Farben

Quellcode

1
this->Object->color = std::vector<GLfloat>{1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};

und das sagt der Debugger über den Buffer

Quellcode

1
2
3
4.4591559e-039, 4.6097451e-039, 4.6097955e-039, 
4.6097955e-039, 1.4012985e-045, 2.8025969e-045, 
-4.3160208e+008, -4.2201683e+037, -1.2197928e-012,


Ich kann mir das ganze nicht ganz erklären
Wenn einer eine Idee hat wäre ich ihm sehr dankbar.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

7

28.02.2014, 11:31

4.6095096e-039 ist 0 ;) (Siehe http://www.wolframalpha.com/input/?i=4.6095096e-039&dataset= )

Allerdings sind die 0.5er Werte nicht im Buffer. Du solltest noch mal überprüfen, wie du die befüllst.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

8

28.02.2014, 15:13

Ich habe mir das noch einmal genau angeguckt aber ich komme einfach nicht auf meinen Fehler.

Ich lade hier noch einmal meinen Quellcode hoch.
Die BufferClass

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class ObjectClass
{
        public:
    std::vector<GLfloat> vertice;
    std::vector<GLfloat> color;
    GLuint VBO_vertice;
    GLuint VBO_color;
    GLuint VAO;
};


Das erstellen der ObjectClass und aufrufen der funktion zum erstellen des Buffers

C-/C++-Quelltext

1
2
3
4
5
6
7
8
this->Object = std::shared_ptr<ObjectClass>(new ObjectClass());
    this->Object->vertice = std::vector<GLfloat>{0.0f, 0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f};
    this->Object->color = std::vector<GLfloat>{1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f};
    GraphicClass::CreateVBO(this->Object);


und noch einmal die CreateVBO-funktion

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
bool GraphicClass::CreateVBO(std::shared_ptr<ObjectClass> Object)
{
    Object->VBO_vertice = 0;
    glGenBuffers(1, &Object->VBO_vertice);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
    glBufferData(GL_ARRAY_BUFFER, Object->vertice.size() * sizeof (GLfloat), &Object->vertice, GL_STATIC_DRAW);

    Object->VBO_color = 0;
    glGenBuffers(1, &Object->VBO_color);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);
    glBufferData(GL_ARRAY_BUFFER, Object->color.size() * sizeof (GLfloat), &Object->color, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    Object->VAO = 0;
    glGenVertexArrays(1, &Object->VAO);
    glBindVertexArray(Object->VAO);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_vertice);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindBuffer(GL_ARRAY_BUFFER, Object->VBO_color);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    return true;
}


Das ist alles was ich im Moment habe. Dabei kommen leider Bufferdaten raus die nicht mit denen zusammen passen die ich in dies Funktion stecke. Nach langem Debuggen konnte ich ausschließen das die Daten im Vector falsch sind.

Ich bedanke mich bei allen die sich um mein Problem kümmern und mir helfen dieses Fehler zu finden.

9

28.02.2014, 18:26

"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

10

01.03.2014, 18:01

Danke an Steef das ich nur die Adresse übergeben habe war ein unnötiger Fehler. Damit hat sich dann auch das Problem mit dem Buffer gelöst. Doch leider sehe ich immer noch kein Dreieck auf meinem Bildschirm :(
Gibt es noch eine Idee woran der Fehler liegen kann? Ich habe noch einmal den gDEBugger rüberlaufen lasse und habe diese warnung bekommen

Zitat

Debug String: Detected error: The debugged process asked for an extension function pointer (wglCreateContextAttribsARB) from one render context, but called this function pointer in another render context (context #0)

hat das unmittelbar was mit meinem Problem zu tun? sonst werden mir keine weiteren Error ausgegeben.

Ich würde ungern hier den ganze Quellcode posten da er viel zu lang ist rücke aber natürlich alles raus was irgendwie weiterhilft

Werbeanzeige