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.07.2012, 19:35

[OpenGL] Shader laden

Huhu!
Nachdem ich nun diesen eof-Fehler behoben hatte, vielleicht auch nicht so, dass es funktioniert, jedenfalls kommt er nicht mehr, brachte dies immer noch keine Besserung.
Ich möchte ganz simpel ein Dreieck rot einfärben.
Ich habe eine Funktion geschrieben, welche den GLSL-Code lädt und ein Program registriert, halt all das was so nötig ist.

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
GLuint LoadShader(const std::string& VertexFileName, const std::string& FragmentFileName)
{
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    //Loading Vertex-Shader
    std::fstream VertexShaderStream(VertexFileName.c_str(), std::ios::in);
    std::string VertexShaderCode;
    if(VertexShaderStream.is_open())
    {
        std::stringstream Lines;
        Lines << VertexShaderStream.rdbuf();
        VertexShaderCode = Lines.str();
        VertexShaderStream.close();
    }

    //Loading Fragment-Shader
    std::fstream FragmentShaderStream(FragmentFileName.c_str(), std::ios::in);
    std::string FragmentShaderCode;
    if(FragmentShaderStream.is_open())
    {
        std::stringstream Lines;
        Lines << FragmentShaderStream.rdbuf();
        FragmentShaderCode = Lines.str();
        FragmentShaderStream.close();
    }

    GLint Result = GL_FALSE;
    int InfoLogLength;

    //Compile Vertex-Shader-Code
    char const* VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
    glCompileShader(VertexShaderID);

    //Check the compiled Vertex-Shader-Code
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> VertexShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);

    //Compile Fragment-Shader-Code
    char const* FragmentSourcePointer = FragmentShaderCode.c_str();
    glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
    glCompileShader(FragmentShaderID);

    //Check the compiled Fragment-Shader-Code
    glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);

    //Link the program
    GLuint ProgramID = glCreateProgram();
    glAttachShader(ProgramID, VertexShaderID);
    glAttachShader(ProgramID, FragmentShaderID);
    glLinkProgram(ProgramID);

    //Check the program
    glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
    glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> ProgramErrorMessage(max(InfoLogLength, int(1)));
    glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    return ProgramID;
}

Ich hab mal mit dem Debugger nachgesehen, die ID ist 3, falls das Relevanz hat.
Hier wären dann die Initialisierungen und der Main-Loop:

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
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

GLuint ProgramID = LoadShader("VertexShader.glsl", "FragmentShader.glsl");

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_Triangle), g_Triangle, GL_STATIC_DRAW);
//Main-Loop
do{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glUseProgram(ProgramID);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);

    glfwSwapBuffers();
}while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && glfwGetWindowParam(GLFW_OPENED));
//glfwTerminate() und die Freigabe des Vertexbuffers

Das Dreieck bleibt leider trotzdem weiß.
Weiß wer Rat? Vielleicht übersehe ich einfach nur irgendwas elementares oder hab mal wieder eine falsche Reihenfolge. :crazy:

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.07.2012, 19:48

Werden die Shader korrekt geladen, kompiliert und gelinked? Wie sehen die Shader aus? Gibt's irgendwo Fehler (glGetError())? Was genau heißt "das Dreieck bleibt weiß"? Siehst du wirklich ein Dreieck, nur in anderer Farbe als erwartet? Oder siehst du einfach nur einen komplett weißen Frame, weil Weiß deine Clear Color ist? In letzterem Fall: Wie hast du überprüft, ob das Dreieck überhaupt gerendert wird bzw. zu sehen ist?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (12.07.2012, 19:54)


stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

3

12.07.2012, 20:07

Ich glaube du hast deine AttributeLocations noch nicht gesetzt ...



Nach dem Attach fehlt sowas wie ...



C-/C++-Quelltext

1
2
3
4
5
    GL::glBindAttribLocation(m_ShaderProg, 0, "_v3Vertex");

    GL::glBindAttribLocation(m_ShaderProg, 1, "_v3Normal");

    GL::glBindAttribLocation(m_ShaderProg, 2, "_v2Texture");
"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

4

12.07.2012, 20:21

glBindAttribLocation() ist nicht zwingend notwendig. Abgesehen davon, könnte er die auch per layout() Qualifier fix im Shader setzen.

5

12.07.2012, 21:22

Meine ClearColor ist Blau, ich kann das Dreieck also ganz klar sehen.
glGetError() sagt 0.
Egal wo ich es hinschrieb.
In anderer Farbe als erwartet... Naja, auch ohne Shader wars weiß, ist ja, glaub ich, so eine Default-Color.
Naja, ich erhalte keinen einzigen Error was die Shader betrifft, welche dann auch so aussehen: (Der Dateiinhalt geht von Kommentar 1 bis Kommentar 2, kein Zeilenumbruch selbst eingefügt, falls das Relevanz hat. Bin was GLSL betrifft ja ziemlicher Neuling.)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//SimpleVertexShader.glsl
#version 330 core

layout(location = 0) in vec3 vertexPosition_modelspace;

void main(){
    gl_Position.xyz = vertexPosition_modelspace;
}

//SimpleFragmentShader.glsl
#version 330 core

out vec3 color;

void main()
{
    color = vec3(1,0,0);
}


MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

12.07.2012, 22:17

Mal den out-Wert rein zu Testzwecken ersetzt durch gl_FragColor (das dürfte doch noch gültig sein, oder?)? Wahlweise mal mit einem vec4 probiert?
(Sorry, bin in 3.3 nicht sonderlich bewandert, falls es Quatsch ist, einfach Bescheid geben)
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

12.07.2012, 22:53

Du solltest von gl_Position alle vier Komponenten schreiben (w = 1) und für color würd ich jetzt auch mal ein vec4 verwenden, wobei das beides wohl eigentlich nicht das Problem sein sollte. Deinem Fragment Shader Output solltest du allerdings auf jeden Fall mal die Location 0 geben.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (12.07.2012, 23:00)


8

13.07.2012, 13:37

Leider noch immer weiß... :(

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

13.07.2012, 14:22

Was steht denn z.B. in VertexShaderErrorMessage, FragmentShaderErrorMessage und ProgramErrorMessage?
Du fragst die zwar ab, wertest die aber nirgends aus.
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]

10

13.07.2012, 17:00

VertexShaderErrorMessage ist voll mit 67 Nullen,
FragmentShaderErrorMessage ebenso,
ProgramErrorMessage jedoch hat 186 Nullen.
Für mich scheint es, dass das ok ist... D:

MfG
Check

Werbeanzeige