"和格式问题,java,opengl,glsl,shader"/>

首页 > 解决方案 > GLSL 错误意外 $end at token ""和格式问题

问题描述

所以我有一个使用opengl来绘制三角形并让它做各种事情的任务。我的顶点着色器文件有问题由于某种原因,如果我尝试在着色器文件中插入新行,它会中断并且不显示三角形。例如,如果我换行。

#version 430
out vec4 varyingColor;
uniform float offsetV;
uniform int gradientChange;
uniform float size;
uniform float offsetCx; 
uniform float offsetCy;

这将打破,它将不再显示三角形。但是当我将它们全部放在一行中时,我得到一个错误但是我得到了代码的全部功能,三角形显示,它移动等等。

(0) : 错误 C0000: 语法错误,意外 $end at token ""

这是我的顶点着色器

#version 430
out vec4 varyingColor;uniform float offsetV;uniform int gradientChange;uniform float size;uniform float offsetCx; uniform float offsetCy;
void main(void){    
    if(gl_VertexID==0){gl_Position= vec4(size*(0.25)+offsetCx,size*(-0.25+offsetV)+offsetCy,0.0,1.0);}
    if(gl_VertexID==1){gl_Position=vec4(size*(-0.25)+offsetCx,size*(-0.25+offsetV)+offsetCy,0.0,1.0);} 
    if(gl_VertexID==2){gl_Position=vec4(size*(0.0)+offsetCx,size*(0.25+offsetV)+offsetCy,0.0,1.0);}
    if(gradientChange == 0){varyingColor = vec4( 1.0,0.0,0.0,1.0);  }
}

这是我的片段着色器

#version 430
out vec4 color;
in vec4 varyingColor;
void main(void){
    color = varyingColor;
}




    private int createShaderProgram() {
        GL4 gl = (GL4) GLContext.getCurrentGL();
        int[] vertCompiled = new int[1];
        int[] fragCompiled = new int[1];
        int[] linked = new int[1];


        String vshaderSource [];
        String fshaderSource [];
        vshaderSource = readShaderSource("src/code/vertShader.glsl");
        fshaderSource = readShaderSource("src/code/fragShader.glsl");

        int vShader = gl.glCreateShader(GL_VERTEX_SHADER);
        gl.glShaderSource(vShader,  3,  vshaderSource, null, 0);
        gl.glCompileShader(vShader);

        //catch error code chunks
        checkOpenGLError();
        gl.glGetShaderiv(vShader,  GL_COMPILE_STATUS,  vertCompiled, 0);
        if(vertCompiled[0] !=1) {
            System.out.println("vertext compilation failed.");
            printShaderLog(vShader);
        }




        int fShader=gl.glCreateShader(GL_FRAGMENT_SHADER);
        gl.glShaderSource(fShader,  4,  fshaderSource, null, 0);
        gl.glCompileShader(fShader);


        //catch error code chunks
        checkOpenGLError();
        gl.glGetShaderiv(fShader,  GL_COMPILE_STATUS,  fragCompiled, 0);
        if(fragCompiled[0] !=1) {
            System.out.println("fragment compilation failed.");
            printShaderLog(fShader);
        }

        if((vertCompiled[0] !=1) ||((fragCompiled[0] !=1))) {
            System.out.println("\nCompilation Error; return-flags:");
            System.out.println("vertCompiled = " +vertCompiled[0] + "; fragCompiled " + fragCompiled[0]);
        }


        gl.glShaderSource(vShader, vshaderSource.length, vshaderSource, null, 0);
        gl.glShaderSource(fShader, vshaderSource.length, vshaderSource, null, 0);

        int vfProgram = gl.glCreateProgram();
        gl.glAttachShader(vfProgram, vShader);
        gl.glAttachShader(vfProgram, fShader);
        gl.glLinkProgram(vfProgram);

        gl.glDeleteShader(vShader);
        gl.glDeleteShader(fShader);
        return vfProgram;

    }

标签: javaopenglglslshader

解决方案


问题是线路

gl.glShaderSource(vShader,  3,  vshaderSource, null, 0);

分别

gl.glShaderSource(fShader,  4,  fshaderSource, null, 0);

vshaderSource并且fshaderSource是字符串数组 ( String[])。glShaderSource可以得到一个字符串数组。但是您必须将数组的长度设置为第二个参数:

gl.glShaderSource(vShader, vshaderSource.length, vshaderSource, null, 0);
gl.glShaderSource(fShader, fshaderSource.length, fshaderSource, null, 0);

推荐阅读