【发布时间】:2021-10-25 03:55:06
【问题描述】:
我正在尝试 LWJGL 3 中的一些代码,使用 Eclipse IDE 和 GitHub 在两台计算机(我的个人 PC 和我的工作一台)上编辑代码。代码的提交和拉取似乎工作正常,直到我的代码停止在我的个人电脑上工作。在试图了解原因时,我发现这可能是我的着色器类出现了一些错误,奇怪的是,这在我工作的 PC 上并没有发生。调整我的着色器类代码后,将一些验证(“glValidateProgram”和“GL_LINK_STATUS”)作为着色器程序不工作的原因,程序返回此错误:
Exception in thread "main" java.lang.Exception: Error linking Shader code: Fragment info
-------------
0(11) : error C1105: cannot call a non-function
(0) : error C2003: incompatible options for link
at br.com.renanlima.engineIO.ShaderLoader.<init>(ShaderLoader.java:62)
at br.com.renanlima.git.main.main(main.java:115)
我真的找不到错误的含义,所以现在我寻求帮助以了解问题所在。
我的着色器加载类
import static org.lwjgl.opengl.GL30.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.FloatBuffer;
import java.util.HashMap;
import java.util.Map;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.lwjgl.system.MemoryStack;
public class ShaderLoader {
public int ID;
public final Map<String, Integer> uniforms;
public ShaderLoader (String vertexFile, String fragmentFile) throws Exception {
uniforms = new HashMap<>();
StringBuilder vertShaderSource = new StringBuilder();
StringBuilder fragShaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader(vertexFile));
String line;
while((line = reader.readLine()) != null) {
vertShaderSource.append(line).append("\n");
}
reader.close();
} catch (IOException e) {
throw new IllegalStateException("Failed to load vertex shader");
}
try {
BufferedReader reader = new BufferedReader(new FileReader(fragmentFile));
String line;
while((line = reader.readLine()) != null) {
fragShaderSource.append(line).append("\n");
}
reader.close();
} catch (IOException e) {
throw new IllegalStateException("Failed to load fragment shader");
}
ID = glCreateProgram();
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, vertShaderSource);
glCompileShader(vertexShader);
glShaderSource(fragmentShader, fragShaderSource);
glCompileShader(fragmentShader);
glAttachShader(ID, vertexShader);
glAttachShader(ID, fragmentShader);
glLinkProgram(ID);
if (glGetProgrami(ID, GL_LINK_STATUS) == 0) {
throw new Exception("Error linking Shader code: " + glGetProgramInfoLog(ID, 1024));
}
if (vertexShader != 0) {
glDetachShader(ID, vertexShader);
}
if (fragmentShader != 0) {
glDetachShader(ID, fragmentShader);
}
glValidateProgram(ID);
if (glGetProgrami(ID, GL_VALIDATE_STATUS) == 0) {
System.err.println("Warning validating Shader code: " + glGetProgramInfoLog(ID, 1024));
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
public void use() {
glUseProgram(ID);
}
public int getID() {
return ID;
}
public void createUniform(String uniformName) throws Exception {
int uniformLocation = glGetUniformLocation(ID,
uniformName);
if (uniformLocation < 0) {
throw new Exception("Could not find uniform:" +
uniformName);
}
uniforms.put(uniformName, uniformLocation);
}
public void setUniformBoolean(String uniformName, boolean value) {
float toLoad = 0;
if(value) {
toLoad = 1;
}
glUniform1f(uniforms.get(uniformName), toLoad);
}
public void setUniformVector(String uniformName, Vector3f vector) {
glUniform3f(uniforms.get(uniformName), vector.x, vector.y, vector.z);
}
public void setUniformMatrix(String uniformName, Matrix4f value) {
// Dump the matrix into a float buffer
try (MemoryStack stack = MemoryStack.stackPush()) {
FloatBuffer fb = stack.mallocFloat(16);
value.get(fb);
glUniformMatrix4fv(uniforms.get(uniformName), false, fb);
}
}
public void unbind() {
glUseProgram(0);
}
public void cleanup() {
unbind();
if (ID != 0) {
glDeleteProgram(ID);
}
}
}
我的顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;
uniform mat4 viewMatrix;
void main()
{
gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(aPos, 1.0);
ourColor = aColor;
TexCoord = aTexCoord;
}
我的片段着色器
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
uniform sampler2D texture;
void main()
{
FragColor = texture(texture, TexCoord);
}
在主渲染类中调用着色器加载器类(“new ShaderLoader”行是错误返回的那一行)
public static void main(String[] args) throws Exception {
Render render = new Render();
window = render.init();
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);
createCapabilities();
ModelLoader squareModel = new ModelLoader(position, colorPos, texturePos, indices);
EntityLoader squareEntity = new EntityLoader(squareModel, new Vector3f(0,0,-1),0,0,0,1);
Camera camera = new Camera();
ShaderLoader shader = new ShaderLoader("game_engine/src/Shaders/vertex.vert", "game_engine/src/Shaders/fragment.frag");
shader.createUniform("projectionMatrix");
shader.createUniform("viewMatrix");
shader.createUniform("transformationMatrix");
while(!glfwWindowShouldClose(window))
{
processInput(window); ...
【问题讨论】:
-
不要将您的采样器命名为与
texture方法相同。 -
哇,它成功了。非常感谢你的洞察力,我愚蠢的鸟脑子甚至没有意识到程序会搞混。
标签: java github opengl shader lwjgl