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

12.09.2017, 19:43

OpenGL problem mit Shader.

Hallo zusammen.

Bin vor kurzen von Smartphone-programmieren wieder auf Window umgestiegen und habe eine Übung für OpenGL aufgebaut.
Jetzt habe ich folgendes Problem und zwar das Polygon wird ohne Shader fehlerfrei dargestellt aber wenn ich glUseProgramm ausführe bleibt das Fenster leer.
Ich kann selber so keinen Fehler entdecken.
Kann mir jemand helfen.

Hier meine Quelltexte.

VertexShader:

C-/C++-Quelltext

1
2
3
4
void main()
{
gl_Position=gl_Vertex;
}


FragmentShader:

C-/C++-Quelltext

1
2
3
4
void main()
{
    gl_FragColor=vec4(0,1,0,1);
}


Main.cpp

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
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <glew.h>
#include <glut.h>
#include "Plane.h"
#include "Shader.h"

Plane *plane;
GLint ShPrg;

void InitOpenGL()
{
    glClearColor(0, 0, 0, 1);
}

void InitGame()
{
    // Zu Testzwecken.
    Shader vertexShader;
    ShPrg=vertexShader.createShader("VertexShader.glsl","FragmentShader.glsl");
    plane=new Plane();
}

void GameLoop()
{

}

void Display()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    GameLoop();

    glColor4f(1, 0, 0, 1);

    plane->Draw(ShPrg);

    glutSwapBuffers();
}

void Reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, (GLdouble)w / (GLdouble)h, 1, 200);
}

int main()
{
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(1024, 768);

    glutCreateWindow("MyOpenGL");

    InitOpenGL();
    glewInit();
    InitGame();

    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);

    glutMainLoop();

    delete plane;
    return 0;
}


Plane.h

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
#pragma once
class Plane {
public:
    Plane();
    ~Plane();

    void Draw(GLuint ShPrg);
private:
    GLuint VertexBuffer, IndexBuffer;

    GLfloat Vertices[18]={
        -.5, .5,-5,
        .5, .5,-5,
        -.5, -.5,-5,

        .5,-.5,-5,
        .5, .5,-5,
        -.5, .5,-5
    };

    GLbyte Indices[6] = {
        0,1,2,
        1,2,3
    };
};


Plane.cpp

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
#include <glew.h>

#include "Plane.h"

#define BUFFER_OFFSET(i) ((void*)(i))

Plane::Plane()
{
    // Vor glGenBuffers muss in main.cpp glewInit ausgeführt werden.
    glGenBuffers(1, &VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

    glGenBuffers(1, &IndexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
}

Plane::~Plane()
{
    glDeleteBuffers(1, &VertexBuffer);
    glDeleteBuffers(1, &IndexBuffer);
}

void Plane::Draw(GLuint ShPrg)
{
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));   //The starting point of the VBO,   glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);

    glUseProgram(ShPrg);

    glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_BYTE, 0);

    glDisableVertexAttribArray(0);
    glDisableClientState(GL_ARRAY_BUFFER);
}


Shader.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#pragma once

class Shader
{
public:
    Shader();
    ~Shader();

    int createShader(char *VertexFile,char *FragmentFile);

};


Shader.cpp

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "Shader.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <glew.h>

Shader::Shader()
{

}

Shader::~Shader()
{

}

int Shader::createShader(char *VertexFile,char *FragmentFile)
{
    std::fstream VertFile(VertexFile);
    std::string Code;
    if (VertFile.is_open())
    {
        std::string line;
        while (std::getline(VertFile, line))
        {
            line += "\n";
            Code += line;
        }
        VertFile.close();
    }

    GLint VertShader,FragShader;

    const char *VertShBuffer= Code.c_str();
    VertShader=glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(VertShader, 1, &VertShBuffer, NULL);
    glCompileShader(VertShader);
    GLint Status;
    glGetShaderiv(VertShader, GL_COMPILE_STATUS, &Status);
    if (Status != GL_TRUE)
    {
        char buffer[512];
        glGetShaderInfoLog(VertShader, 512, NULL, buffer);
        std::cout << buffer;
    }

    Code.clear();

    std::fstream FragFile(FragmentFile);
    if (FragFile.is_open())
    {
        std::string line;
        while (std::getline(FragFile, line))
        {
            line += "\n";
            Code += line;
        }
        FragFile.close();
    }

    FragShader = glCreateShader(GL_FRAGMENT_SHADER);
    const char *FragShBuffer = Code.c_str();
    glShaderSource(FragShader, 1, &FragShBuffer, NULL);
    glCompileShader(FragShader);
    glGetShaderiv(FragShader, GL_COMPILE_STATUS, &Status);
    if (Status != GL_TRUE)
    {
        char buffer[512];
        glGetShaderInfoLog(FragShader, 512, NULL, buffer);
        std::cout << "FragmentShader Error "<<buffer;
    }

    GLuint Prg = glCreateProgram();
    glAttachShader(Prg, VertShader);
    glAttachShader(Prg, FragShader);

    glLinkProgram(Prg);
    GLint linked;
    glGetProgramiv(Prg, GL_LINK_STATUS, &linked);
    if (linked)
    {
        // ok!
        std::cout << "Shader link sucesfull !";
    }

    glDetachShader(Prg, VertShader);
    glDetachShader(Prg, FragShader);

    glDeleteShader(VertShader);
    glDeleteShader(FragShader);

    return Prg;
}


Danke .

2

13.09.2017, 09:23

Problem gelöst.

Im VertexShader lag der fehler richtig gewesen wäre.

gl_Position 0 gl_ModelViewProjectionMatrix*glVertex;

Danke an alle die reingeschaut haben.

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

22.09.2017, 15:02

Du scheinst den alten GLSL Standard zu nutzen, was im Grunde kein Problem sein sollte, aber ich meine, dass man auch da immer die GLSL Version angeben muss.
Andernfalls ist es von der Fehlertoleranz des Treibers abhängig, ob dein Shader kompiliert oder nicht.

Füge am besten mal folgende Zeile deinen Shadern hinzu (muss vor allen anderen Präprozessordirektiven und Anweisungen erscheinen):

C-/C++-Quelltext

1
#version 120


Ich empfehle dir dazu auch den glslangValidator (Khronos' Referenzcompiler), um zu prüfen, ob dein Shader Standardkonform ist.

Gruß,
Lukas

Werbeanzeige