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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

18.11.2015, 18:40

[SOLVED] [GL] Shader mit LWJGL (Java) compilieren

Hallo,

ich habe ein komisches Problem mit LWJGL einen Shader zu laden.
Code:

Quellcode

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
// shader source laden
        String vertexSrc = new String(Files.readAllBytes(Paths.get(vertex)), Charset.defaultCharset());
        String fragmentSrc = new String(Files.readAllBytes(Paths.get(fragment)), Charset.defaultCharset());

        // shader erstellen
        vertexShader = glCreateShader(GL_VERTEX_SHADER);
        fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
       
        glShaderSource(vertexShader, vertexSrc);
        glShaderSource(fragmentShader, fragmentSrc);
        
        glCompileShader(vertexShader);
        glCompileShader(fragmentShader);
        
        // shader Status prüfen
        IntBuffer vertexCompileResult = BufferUtils.createIntBuffer(1);
        IntBuffer fragCompileResult = BufferUtils.createIntBuffer(1);
        
        glGetShaderiv(vertexShader, GL_COMPILE_STATUS, vertexCompileResult);
        glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, fragCompileResult);
        
        if(vertexCompileResult.get(0) != 0){
            System.err.println("Shader vertex compile error: "+String.valueOf(vertexCompileResult.get(0)));
            System.err.println("Log: "+glGetShaderInfoLog(vertexShader));
        }
        
        if(fragCompileResult.get(0) != 0){
            System.err.println("Shader fragment compile error: "+String.valueOf(fragCompileResult.get(0)));
            System.err.println("Log: "+glGetShaderInfoLog(fragmentShader));
        }
        
        // an Shader Programm binden und linken
        shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragmentShader);
        glLinkProgram(shaderProgram);
        
        // Status prüfen
        IntBuffer linkResult = BufferUtils.createIntBuffer(1);
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, linkResult);
        
        if(linkResult.get(0) != 0){
            System.err.println("Shader link error: "+String.valueOf(linkResult.get(0)));
        }
        
        // Anbindung an VBOs
        glUseProgram(shaderProgram);
//        glBindAttribLocation(shaderProgram, 0, "vertex");
//        glBindAttribLocation(shaderProgram, 1, "texCoord");
        
        // GL Fehler prüfen
        int err = glGetError();
        
        if(err != 0){
            System.err.println("Shader GL error 2: "+String.valueOf(err));
        }


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vertex
#version 150

uniform mat4 pv, m;

in vec3 vertex;
in vec2 texCoord;

out vec2 tc;

void main(){
    tc = texCoord;
    gl_Position = pv*m*vec4(vertex, 1.0);
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
// fragment
#version 150
precision highp float;

uniform sampler2D tex;

in vec2 tc;

out vec4 color;

void main(){
    color = texture(tex, tc);
}


Der Vertexshader kompiliert anstandslos, der Fragmentshader gibt mir einen Fehler (1). Aber der Shader Log ist leer?
Lass ich das ; hinter color = vec4(... weg bekomme ich keinen Fehler. Das kann doch nicht sein, was übersehe ich hier?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »DeKugelschieber« (29.11.2015, 19:07)


2

18.11.2015, 19:31

Hast du mal versucht den Fragment Shader ohne Precision Qualifier zu benutzen?
Ich weiß natürlich nicht welche OpenGL Version du hier benutzt, aber ich meine je nach Gerät/Grafiktreiber/OpenGL Version können die Precision Qualifier Probleme machen.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

18.11.2015, 19:36

Code oben noch mal angepasst.

Ich bekomme jetzt (auch ohne precision) bei beiden Shadern und beim Shaderprogramm Fehlercode 1, aber keinen Log.
Version ist #150 -> OpenGL 3.2. Wobei ich eigentlich 130 nehmen würde (für meinen Laptop).
Mein Rechner unterstützt: GL version: 4.5.0 NVIDIA 352.55

[Edit] Ach jau, Code 1 ist true, also kein Fehler :P
Läuft, kommt davon wenn man unter Druck sowas in Java :ill: schreiben muss.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (18.11.2015, 19:43)


4

18.11.2015, 19:46

Habe gerade mal ein Testprojekt geschrieben nur um die Shader mal kompilieren zu lassen und zu linken.
Bei mir wird kein Fehler geschmissen, ob mit oder ohne Precision Qualifier.
Das ganze mit selbstgebautem Framework in C# und mit Zugriff auf OpenGL 3.3

Das einzige das ich geändert habe - aber auch nur weil mein Framework das so verlangt - ist im Vertexshader

HLSL-Quelltext

1
uniform mat4 pv, m;

Zu

HLSL-Quelltext

1
2
uniform mat4 pv;
uniform mat4 m;

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

18.11.2015, 19:48

Jup oben editiert, "Fehler"code 1 ist kein Fehler...
Jetzt bekomme ich auch kein GL_INVALID_OPERATION wenn ich glUseProgram(id); schreibe :)

Mal sehen wann der nächste Fehler kommt...
Aber dankeschön.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

18.11.2015, 21:14

[Edit]

Ich glaub ich benutze einfach JavaFX, das sollte reichen für meine Zwecke.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (18.11.2015, 21:30)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

29.11.2015, 15:55

Tja JavaFX wurde abgelehnt, das sei ja zu "wenig". Daher wieder mit GL direkt. Ich bekomme einen ganz komischen Fehler, wenn ich versuche ein Sprite zu rendern. Hier mal die relevanten Teile:

Quellcode

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
// im Sprite
public void createRect(){
    int i[] = {0, 1, 2, 1, 2, 3};
    float v[] = {0, 0, 1, 0, 0, 1, 1, 1};
    float t[] = {0, 0, 1, 0, 0, 1, 1, 1};
    
    index = new VBO(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW);
    index.setData(i);
    vertex = new VBO(); // keine Parameter = GL_ARRAY_BUFFER, GL_STATIC_DRAW
    vertex.setData(v);
    texCoord = new VBO();
    texCoord.setData(t);
    
    // GL Fehler prüfen
    int err = glGetError();
    
    if(err != 0){
        System.err.println("Sprite: "+String.valueOf(err));
    }
}

// setData vom VBO (für int natürlich mit IntBuffer):
public void setData(final float data[]){
    FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
    buffer.put(data);
    
    bind();
    glBufferData(target, buffer, usage);
    unbind();
    
    size = data.length;
}

// render Methode:
public void draw(){
    Matrix3f m = new Matrix3f();
    m.identity();
    m.scale(new Vector2f(10));
    
    shader2D.bind();
    shader2D.enableAttribArrays();
    shader2D.sendMat3("o", camera.getOrthoMatrix());
    shader2D.sendMat3("m", m);
    
    int verLoc = shader2D.getAttribLocation("vertex"); // ist 0
    
    sprite.getIndexBuffer().bind();
    sprite.getVertexBuffer().bind();
    sprite.getVertexBuffer().vertexAttribPointer(verLoc, 2, GL_FLOAT, false, 0, 0);
    
    glDrawElements(GL_TRIANGLES, sprite.getIndexBuffer().size(), GL_UNSIGNED_INT, 0);
}

// Vertex Shader:
#version 130

uniform mat3 o, m;
in vec2 vertex;

void main(){
    gl_Position = vec4(o*m*vec3(vertex, 1.0), 1.0);
}

// Fragment Shader:
#version 130
precision highp float;

out vec4 color;

void main(){
    color = vec4(1.0, 1.0, 1.0, 0.5);
}


1285, also GL_OUT_OF_MEMORY. Nur wenn ich glDrawElements auch aufrufe (direkt davor kein Fehler von glGetError). Daran wirds aber wahrscheinlich nicht hängen? Die Buffer werden nicht jedes Frame neu aufgesetzt oder ähnlich und sehen gültig aus (bekommen entsprechende IDs zugewiesen).
Jemand eine Idee? Ich verzweifle langsam an dem Scheiß.

[Edit]

Rufe ich buffer.flip(); in setData() auf, bekomme ich kein out of memory, aber ein schwarzes Fenster :) Hach wie ich es liebe.
Kann mir jemand erklären warum das so ist und sieht jemand das Problem warum einfach überhaupt nichts anzeigt wird?

[Edit 2]

Matrizen noch mal überprüft, passt. Stimmen mit denen aus meinem C++ Code überein.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (29.11.2015, 16:28)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

29.11.2015, 19:07

Waaaaaaaaaaa ich kriegs kotzen.
Ich musste einfach nur den FloatBuffer für die Matrizen flippen -.-

Danke, solved.

Werbeanzeige