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.
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. –