【问题标题】:GLSL Shader does not compile, Java and LWJGL shader errorGLSL Shader 无法编译,Java 和 LWJGL 着色器错误
【发布时间】:2014-12-05 00:11:51
【问题描述】:

我现在在编译我的着色器时遇到过几次这个错误。

这里是信息日志/错误

顶点着色器编译失败,出现以下错误: 错误:0:1:错误(#132)语法错误:“

这也发生在片段着色器上。这是我非常非常基本的测试顶点和片段着色器代码:

@version 330

layout (location = 0) in vec3 position;

void main(){

    gl_Position = vec4(position, 1.0);
}

这是碎片:

@version 330

out vec4 fragColor;

void main(){

    fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

这里是具有所有加载/编译/链接方法的 Shader 类:

public  abstract class Shader {

    private int program;

    public Shader(){


        program = glCreateProgram();

        if(program == 0){
            System.err.println("Shader creation failed: Could not find valid memory location");     
            System.exit(1);
        }
    }



    public void bind(){

         glUseProgram(program);

    }

    public 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");      
            System.exit(1);
        }

        glShaderSource(shader, text);
        glCompileShader(shader);             

        if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0){
            System.err.println("Shader compilation failed");
            System.err.println(glGetShaderInfoLog(shader, 1024));
            System.exit(1);
        }

        glAttachShader(program, shader);
    }


    public String loadShader(String fileName){


        StringBuilder shaderSource = new StringBuilder();
        BufferedReader shaderReader = null;

        try{

            shaderReader = new BufferedReader(new FileReader("./res/shaders/" + fileName));

            String line;
            while((line = shaderReader.readLine()) != null){

                shaderSource.append(line).append("\n");
            }

            shaderReader.close();


        }catch(Exception e){
            e.printStackTrace();
            System.out.println("HERE IT IS!!!!");
            System.exit(1);
        }

        return shaderSource.toString();

    }

    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);
        }

    }
}

我已经做了很多实验来看看问题出在哪里,我已经将它缩小到两件事之一。(A) 在 loadShader() 方法中以某种方式从文件中加载文本会返回一堆随机符号(在 infoLog 顶部的通知中,解析错误表明字符是“

【问题讨论】:

  • 看完后能不能打印出整个shader源码? (或用调试器检查)
  • 不应该是#version...而不是@version?
  • 你知道吗......我认为你是对的......我希望不是因为那时我是个白痴......神圣的废话......那是它......认为这是一个我搞砸了预处理器标签...facepalm...非常感谢

标签: java opengl glsl shader lwjgl


【解决方案1】:

答案是.......在着色器代码中声明版本时是#而不是@......

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多