Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 碎片着色器赢得';不编译_Java_Opengl_Compilation_Glsl_Lwjgl - Fatal编程技术网

Java 碎片着色器赢得';不编译

Java 碎片着色器赢得';不编译,java,opengl,compilation,glsl,lwjgl,Java,Opengl,Compilation,Glsl,Lwjgl,我试图让本教程中的着色器正常工作: 我将源代码复制到两个文件中,但两个文件都无法编译 这是我的代码: shaderProgram = glCreateProgram(); vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); StringBuilder vertexShaderSource = new St

我试图让本教程中的着色器正常工作:

我将源代码复制到两个文件中,但两个文件都无法编译

这是我的代码:

    shaderProgram = glCreateProgram();
    vertexShader  = glCreateShader(GL_VERTEX_SHADER);
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    StringBuilder vertexShaderSource   = new StringBuilder();
    StringBuilder fragmentShaderSource = new StringBuilder();

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                vertexShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Vertex no load.");
        Display.destroy();
        System.exit(1);
    }

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                fragmentShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Frag no load.");
        Display.destroy();
        System.exit(1);
    }
    System.out.println(fragmentShaderSource);


    glShaderSource(vertexShader, vertexShaderSource);
    glCompileShader(vertexShader);
    if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("Vertex no compile");
    }
    glShaderSource(fragmentShader, fragmentShaderSource);
    glCompileShader(fragmentShader);
    if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("frag no compile");
    }


    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glValidateProgram(shaderProgram);
我以前使用过着色器,所以这不是我所知道的设置,但是当我复制和粘贴时,两个文件都不会再编译了

我的设置有什么问题吗

编辑>>>

我似乎无法导入glGetShaderiv

我使用LWJGL并从那里导入了所有内容。我会丢失一个JAR文件吗

编辑>>>

相关问题:


您读取的源文件不正确

line = reader.readLine();

while(line != null){
    line = reader.readLine();

    if(line != null){
        fragmentShaderSource.append(line).append('\n');
    }
}
在这里,您首先读取文件的第一行。如果不为null,则继续读取行并将其附加到缓冲区。但是,实际上并没有在循环外部的
readLine()
语句后面追加该行,这意味着它将被丢弃,着色器编译器将获得缺少第一行的源文件。因此它不知道如何改变vec2 vTexCoord
采样器2D myTexture,在稍后代码中使用时引发编译器错误

有几种方法可以解决此问题:


  • 使用哪一种取决于您的偏好。1包含冗余代码,这几乎不是最好的解决方案。2是读取任意文件的常用方式;虽然3较短,但有些人不喜欢在循环控制语句中指定变量。

    您读取的源文件不正确

    line = reader.readLine();
    
    while(line != null){
        line = reader.readLine();
    
        if(line != null){
            fragmentShaderSource.append(line).append('\n');
        }
    }
    
    在这里,您首先读取文件的第一行。如果不为null,则继续读取行并将其附加到缓冲区。但是,实际上并没有在循环外部的
    readLine()
    语句后面追加该行,这意味着它将被丢弃,着色器编译器将获得缺少第一行的源文件。因此它不知道如何改变vec2 vTexCoord
    采样器2D myTexture,在稍后代码中使用时引发编译器错误

    有几种方法可以解决此问题:


  • 使用哪一种取决于您的偏好。1包含冗余代码,这几乎不是最好的解决方案。2是读取任意文件的常用方式;虽然3较短,但有些人不喜欢在循环控制语句中指定变量。

    您读取的源文件不正确

    line = reader.readLine();
    
    while(line != null){
        line = reader.readLine();
    
        if(line != null){
            fragmentShaderSource.append(line).append('\n');
        }
    }
    
    在这里,您首先读取文件的第一行。如果不为null,则继续读取行并将其附加到缓冲区。但是,实际上并没有在循环外部的
    readLine()
    语句后面追加该行,这意味着它将被丢弃,着色器编译器将获得缺少第一行的源文件。因此它不知道如何改变vec2 vTexCoord
    采样器2D myTexture,在稍后代码中使用时引发编译器错误

    有几种方法可以解决此问题:


  • 使用哪一种取决于您的偏好。1包含冗余代码,这几乎不是最好的解决方案。2是读取任意文件的常用方式;虽然3较短,但有些人不喜欢在循环控制语句中指定变量。

    您读取的源文件不正确

    line = reader.readLine();
    
    while(line != null){
        line = reader.readLine();
    
        if(line != null){
            fragmentShaderSource.append(line).append('\n');
        }
    }
    
    在这里,您首先读取文件的第一行。如果不为null,则继续读取行并将其附加到缓冲区。但是,实际上并没有在循环外部的
    readLine()
    语句后面追加该行,这意味着它将被丢弃,着色器编译器将获得缺少第一行的源文件。因此它不知道如何改变vec2 vTexCoord
    采样器2D myTexture,在稍后代码中使用时引发编译器错误

    有几种方法可以解决此问题:



  • 使用哪一种取决于您的偏好。1包含冗余代码,这几乎不是最好的解决方案。2是读取任意文件的常用方式;虽然3较短,但有些人不喜欢在循环控制语句中指定变量。

    试着打印编译器错误,你能解释一下怎么做吗?Eclipse无法识别该语句。你使用的是什么openGL版本?你在使用核心档案吗?您发布的着色器是旧的OpenGL(<3.3),如果您使用的是core pofile>=3.3,则不能使用像
    gl\u MultiTexCoord0
    这样的变量。可能这会导致错误GLGetString(GL_版本)-->4.2.0尝试打印编译器错误,您能解释一下如何执行吗?Eclipse无法识别该语句。您使用的是哪个openGL版本?你在使用核心档案吗?您发布的着色器是旧的OpenGL(<3.3),如果您使用的是core pofile>=3.3,则不能使用像
    gl\u MultiTexCoord0
    这样的变量。可能这会导致错误GLGetString(GL_版本)-->4.2.0尝试打印编译器错误,您能解释一下如何执行吗?Eclipse无法识别该语句。您使用的是哪个openGL版本?你在使用核心档案吗?您发布的着色器是旧的OpenGL(<3.3),如果您使用的是core pofile>=3.3,则不能使用像
    gl\u MultiTexCoord0
    这样的变量。可能这会导致错误GLGetString(GL_版本)-->4.2.0尝试打印编译器错误,您能解释一下如何执行吗?Eclipse无法识别该语句。您使用的是哪个openGL版本?你在使用核心档案吗?您发布的着色器是旧的OpenGL(<3.3),如果您使用的是core pofile>=3.3,则不能使用像
    gl\u MultiTexCoord0
    这样的变量。这可能会导致错误GLGetString(GL_版本)-->4.2.0I实现中断逻辑。我认为这修复了顶点着色器,但片段着色器仍然无法编译。我猜“myTexture”没有被指定(它没有),但这仍然不能解释为什么eclipse不能识别它