【问题标题】:LWJGL 3 Shader Error / Pulling code errorLWJGL 3 着色器错误/拉代码错误
【发布时间】: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); ...

how the program is working at my job's PC

【问题讨论】:

  • 不要将您的采样器命名为与texture 方法相同。
  • 哇,它成功了。非常感谢你的洞察力,我愚蠢的鸟脑子甚至没有意识到程序会搞混。

标签: java github opengl shader lwjgl


【解决方案1】:

根据 BDL 的评论,我将采样器名称更改为“纹理”以外的名称,并且它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多