首页 > 解决方案 > 链接顶点着色器 2 次有效,但不链接顶点和片段着色器

问题描述

自从我尝试调试我最近从 LWJGL2 更新到 LWJGL3 的项目以来已经有好几天了。我发现了一些问题,但它仍然没有工作,所以我做了一个最小的项目,就像真的最小一样,并将它与我在网上找到的工作项目进行了比较。我到了两个项目完全相同的地步,除了在工作项目中我创建了 2 次顶点着色器并在程序中链接了 2 次,而在另一个我正在链接正确的项目时,它们都编译但没有渲染。

这是着色器类:

private int vertexID, fragmentID, programID;
    
    public Shader(String vertexPath, String fragmentPath) {
        vertexID = loadShader(vertexPath,GL20.GL_VERTEX_SHADER);
        fragmentID = loadShader(fragmentPath,GL20.GL_FRAGMENT_SHADER); //Not working
        //fragmentID = loadShader(vertexPath,GL20.GL_VERTEX_SHADER); // Working ?????
        programID = GL20.glCreateProgram();

        GL20.glAttachShader(programID, vertexID);
        GL20.glAttachShader(programID, fragmentID);

        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);
    }

    private int loadShader(String file,int type) {
        StringBuilder shaderSource = new StringBuilder();
        try{
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line;
            while((line = reader.readLine())!=null){
                shaderSource.append(line).append("//\n");
            }
            reader.close();
        }catch(IOException e){
            e.printStackTrace();
            System.exit(-1);
        }
        int shaderID = GL20.glCreateShader(type);
        GL20.glShaderSource(shaderID, shaderSource);
        GL20.glCompileShader(shaderID);
        if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS )== GL11.GL_FALSE){
            System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
            System.err.println("Could not compile shader!");
            System.exit(-1);
        }
        return shaderID;
    }

这是片段着色器:

#version 460 core

in vec3 color;

out vec4 outColor;

void main() {
    outColor = vec4(color, 1.0);
}

和顶点着色器:

#version 460 core

in vec3 position;

out vec3 color;

void main() {
    color = vec3(1,1,1);
}

这是创建显示后立即调用的 Shader 类的行:

    shader = new Shader("src/mainVertex", "src/mainFragment");

我不知道发生了什么,也许问题出在片段着色器上,也许是读者。谢谢你的帮助。

标签: openglglslshaderlwjglfragment-shader

解决方案


正如@Rabbid76 所说,我在顶点着色器中缺少 gl_Position ,但我仍然不知道为什么将顶点着色器链接两次是有效的。


推荐阅读