OpenGL 片段着色器编译问题
OpenGL Fragment Shader Compilation Issue
我正在学习使用 LWJGL 在 Java 中编写游戏引擎的教程。我在 GLSL 中编写了一个片段着色器并将其命名为 basicFragment.fs:
#version 330
out vec4 fragColor;
void main()
{
fragColor = vec4(0,0, 1.0, 1.0, 1.0);
}
现在我按照教程写了一个编译着色器的方法,在这里我得到了一个错误。首先,这是我的着色器 class.
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);
}
}
然后,在我的游戏中 class 我执行以下操作。 (希望代码是不言自明的。如果我不清楚任何地方,请告诉我):
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();
}
所以基本上,当我调用函数时,
shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs"));
该函数给我这个错误:
3.3.0 - Build 8.15.10.2712
ERROR: 0:7: 'constructor' : too many arguments
我刚刚实现顶点着色器时没有收到任何错误,所以我断定它是片段着色器。
着色器的这一部分会抛出该错误 class:
if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0)
{
System.err.println(glGetShaderInfoLog(shader, 1024));
System.exit(1);
}
这让我相信问题在于着色器没有编译,因为某些构造函数的参数太多。我不知道它到底指的是什么构造函数。
如有任何帮助,我们将不胜感激。
I don't know exactly what constructor it is referring to.
您的着色器代码中的那个:
fragColor = vec4(0,0, 1.0, 1.0, 1.0);
那是一个 vec4
构造函数。你给了它 5 个参数。 “0,0”是其中两个。我怀疑你是想用句点而不是逗号。
我正在学习使用 LWJGL 在 Java 中编写游戏引擎的教程。我在 GLSL 中编写了一个片段着色器并将其命名为 basicFragment.fs:
#version 330
out vec4 fragColor;
void main()
{
fragColor = vec4(0,0, 1.0, 1.0, 1.0);
}
现在我按照教程写了一个编译着色器的方法,在这里我得到了一个错误。首先,这是我的着色器 class.
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);
}
}
然后,在我的游戏中 class 我执行以下操作。 (希望代码是不言自明的。如果我不清楚任何地方,请告诉我):
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();
}
所以基本上,当我调用函数时,
shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs"));
该函数给我这个错误:
3.3.0 - Build 8.15.10.2712
ERROR: 0:7: 'constructor' : too many arguments
我刚刚实现顶点着色器时没有收到任何错误,所以我断定它是片段着色器。
着色器的这一部分会抛出该错误 class:
if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0)
{
System.err.println(glGetShaderInfoLog(shader, 1024));
System.exit(1);
}
这让我相信问题在于着色器没有编译,因为某些构造函数的参数太多。我不知道它到底指的是什么构造函数。
如有任何帮助,我们将不胜感激。
I don't know exactly what constructor it is referring to.
您的着色器代码中的那个:
fragColor = vec4(0,0, 1.0, 1.0, 1.0);
那是一个 vec4
构造函数。你给了它 5 个参数。 “0,0”是其中两个。我怀疑你是想用句点而不是逗号。