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

16.02.2013, 18:18

C++ GLSL Shader Probleme

Hallo,

ich versuche zum Einstieg in GLSL Shader eine einfache C++-Klasse zu schreiben, habe jedoch Probleme mit den Shadern:
(zum Testen erstmal nur ein fixxer Fragmentshader in der 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
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
#include "shader.h"
#include <iostream>
#include <fstream>

shader::shader(){ // mode = GL_VERTEX_SHADER or GL_FRAGMENT_SHADER
    int status;

    std::string line, full;
    std::ifstream fragmentfile("fragment.fs");
    if(fragmentfile.is_open()){
        while(fragmentfile.good()){
            getline(fragmentfile, line);
            full += line;
            full += '\n';
        }
        fragmentfile.close();
    }
    static const char* fragment_source = full.c_str();

    std::cout << fragment_source << std::endl;

    program_object = glCreateProgram();
    shaderref = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(shaderref, 1, &fragment_source, NULL);

    glCompileShader(shaderref);
    glGetShaderiv(shaderref, GL_COMPILE_STATUS, &status);
    if(status != GL_TRUE){
        std::cout << "The shader could not be compiled\n" << std::endl;
        char errorlog[500] = {'\0'};
        int loglength;
        glGetShaderInfoLog(shaderref, loglength, 0, errorlog);
        std::cout << "Error: " << errorlog << std::endl;
    }
    else
        std::cout << "The shader could be compiled\n" << std::endl;

    glAttachShader(program_object, shaderref);

    glLinkProgram(program_object);
    glGetProgramiv(program_object, GL_LINK_STATUS, &status);
    if(status != GL_TRUE)
        std::cout << "The shader could not be linked\n";
    else
        std::cout << "The shader could be linked\n";
}

void shader::activateShader(){
    glUseProgram(program_object);
}

void shader::deactivateShader(){
    glUseProgram(0);
}


fragment.fs:

C-/C++-Quelltext

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


Konsolenoutput:

Quellcode

1
2
3
4
5
6
7
8
9
10
void main(void)
{
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}


The shader could not be compiled

Error: 
The shader could not be linked


Hoffe ihr wisst irgendwie weiter, ich hab keine Ahnung mehr ?( .

2

16.02.2013, 19:14

C-/C++-Quelltext

1
2
3
4
5
6
7
    if(status != GL_TRUE){
        std::cout << "The shader could not be compiled\n" << std::endl;
        char errorlog[500] = {'\0'};
        int loglength;
        glGetShaderInfoLog(shaderref, loglength, 0, errorlog);
        std::cout << "Error: " << errorlog << std::endl;
    }


Initialisiere loglength vernünftig und sag uns, was der Shadercompiler zu meckern hat.
Lieber dumm fragen, als dumm bleiben!

3

16.02.2013, 19:23

Initialisiere loglength vernünftig und sag uns, was der Shadercompiler zu meckern hat.
Danke aber er hat leider trotzdem nix zu sagen :|.

C-/C++-Quelltext

1
2
3
4
5
        std::cout << "The shader could not be compiled\n" << std::endl;
        char errorlog[500] = {'\0'};
        int loglength = 500;
        glGetShaderInfoLog(shaderref, loglength, 0, errorlog);
        std::cout << "Error: " << errorlog << std::endl;

4

16.02.2013, 19:39

Vielleicht mag er die 0 als dritten Parameter nicht. Bei mir siehts so aus:

C-/C++-Quelltext

1
2
3
        char Text[512];
        int Length;
        glGetProgramInfoLog(m_ProgramObject, 510, &Length, Text);

Ich bin mir ziemlich sicher, dass im InfoLog immer irgendwas stehen sollte, und sei es auch nur "alles ok".
Ansonsten ist AmdGDebugger auch sehr nützlich.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

16.02.2013, 20:34

Was ist der Inhalt von fragment_source?

Die für den Buffer nötige Größe kannst du übrigens mit glGetShaderi() bzw. glGetProgrami() und GL_INFO_LOG_LENGTH bestimmen...

6

16.02.2013, 21:12

Hmm,
also fragment_source geb ich ja in der Konsole aus:

C-/C++-Quelltext

1
std::cout << fragment_source << std::endl;

Konsole:

Quellcode

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


--

Mittlerweile weiß ich nen bisschen mehr:

int status verändert sich nicht, was laut API durch eine Fehlergenerierung in glGetShaderiv verhindert wird.
glGetError() nach dem Call ist jedoch 0 ?(.

--

Nach stundenlangem Fehlersuchen hab ich einfach mal nen neues Projekt erstellt mit einer main.cpp Spaghetticode und Copy & Paste den Code aus den Klassen und alles geht wie erwartet.

Was es auch immer war, nun bin ich froh, dass endlich Shader gehen :).

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »xXFlorianXx« (17.02.2013, 17:16)


Werbeanzeige