2016-04-12 13 views
0

Ich folgte einem Tutorial zum Schreiben einer Game-Engine in Java mit LWJGL. Ich schrieb ein Fragment-Shader in GLSL und nannte es basicFragment.fs:OpenGL Fragment Shader Kompilierung Problem

#version 330 

out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(0,0, 1.0, 1.0, 1.0); 
} 

Nun folgte ich dem Tutorial, einen Weg zu schreiben, den Shader zu kompilieren und es ist hier, dass ich einen Fehler. Erstens, hier ist meine Shader-Klasse.

package com.base.engine; 

import static org.lwjgl.opengl.GL20.*; 
import static org.lwjgl.opengl.GL21.*; 
import static org.lwjgl.opengl.GL32.*; 

public class Shader 
{ 
    private int program; 

    public Shader() 
    { 
     program = glCreateProgram(); 

     if(program == 0) 
     { 
      System.err.println("Shader creation failed: Could not find valid memory location in constructor"); 
      System.exit(1); 
     } 
    } 

    public void bind() 
    { 
     glUseProgram(program); 
    } 

    public void addVertexShader(String text) 
    { 
     addProgram(text, GL_VERTEX_SHADER); 
    } 

    public void addGeometryShader(String text) 
    { 
     addProgram(text, GL_GEOMETRY_SHADER); 
    } 

    public void addFragmentShader(String text) 
    { 
     addProgram(text, GL_FRAGMENT_SHADER); 
    } 

    public void compileShader() 
    { 
     glLinkProgram(program); 

     if(glGetProgrami(program, GL_LINK_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(program, 1024)); 
      System.exit(1); 
     } 

     glValidateProgram(program); 

     if(glGetProgrami(program, GL_VALIDATE_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(program, 1024)); 
      System.exit(1); 
     } 
    } 

    private void addProgram(String text, int type) 
    { 
     int shader = glCreateShader(type); 

     if(shader == 0) 
     { 
      System.err.println("Shader creation failed: Could not find valid memory location when adding shader"); 
      System.exit(1); 
     } 

     glShaderSource(shader,text); 
     glCompileShader(shader); 

     if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(shader, 1024)); 
      System.exit(1); 
     } 

     glAttachShader(program, shader); 
    } 
} 

Dann mache ich in meinem Spiel Klasse folgendes. (Hoffentlich ist der Code selbsterklärend Lassen Sie mich wissen, wenn ich nicht klar bin überall.):

public class Game 
{ 
    private Mesh mesh; 
    private Shader shader; 

    public Game() 
    { 
     mesh = new Mesh(); 
     shader = new Shader(); 

     Vertex[] data = new Vertex[] {new Vertex(new Vector3f(-1,-1,0)), 
             new Vertex(new Vector3f(-1,1,0)), 
             new Vertex(new Vector3f(0,1,0))}; 

     mesh.addVertices(data); 

     shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs")); 
     shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs")); 
     shader.compileShader(); 
    } 

    public void render() 
    { 
     shader.bind(); 
     mesh.draw(); 

    } 

Also im Grunde, wenn ich die Funktion aufrufen,

shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs")); 

Die Funktion gibt mir diese Fehlermeldung:

3.3.0 - Build 8.15.10.2712 
ERROR: 0:7: 'constructor' : too many arguments 

Ich bekomme keinen Fehler, wenn ich nur den Vertex-Shader implementiere, also habe ich festgestellt, dass es der Fragment-Shader ist.

if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0) 
{ 
    System.err.println(glGetShaderInfoLog(shader, 1024)); 
    System.exit(1); 
} 

Was mich führt zu glauben, dass das Problem ist, dass der Shader, weil einige Konstruktor nicht kompiliert wird, zu viele Argumente hat:

Dieser Fehler wird immer von diesem Teil der Klasse Shader geworfen. Ich weiß nicht genau, auf welchen Konstruktor es sich bezieht.

Jede Hilfe wäre willkommen.

Antwort

0

I don't know exactly what constructor it is referring to.

Die in Ihrem Shader-Code:

fragColor = vec4(0,0, 1.0, 1.0, 1.0); 

Das ist ein vec4 Konstruktor ist. Und du hast ihm 5 Parameter gegeben. "0,0" ist zwei von ihnen. Ich vermute eher, dass Sie eher eine Periode als ein Komma verwenden wollten.

+0

Vielen Dank. Ich habe das nach der Veröffentlichung meiner Frage herausgefunden, aber ich weiß die Antwort zu schätzen. Hoffentlich hilft es anderen dort draußen. –