Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 Can';I don’我无法成功链接OpenGL程序_Java_Eclipse_Opengl_Glsl_Shader - Fatal编程技术网

Java Can';I don’我无法成功链接OpenGL程序

Java Can';I don’我无法成功链接OpenGL程序,java,eclipse,opengl,glsl,shader,Java,Eclipse,Opengl,Glsl,Shader,以下是我的(非常简单的)着色器: 以下是我如何尝试获得一个程序: private int créeProgrammeOpenGL(){ IntBuffer résultatEditionLiens; int transformateurSommets,transformateurFaces; int programme; transformateurSommets = chargeTransformateur(GL4.GL_VERTEX_SHADER,codeT

以下是我的(非常简单的)着色器:

以下是我如何尝试获得一个程序:

private int créeProgrammeOpenGL(){
    IntBuffer résultatEditionLiens;
    int transformateurSommets,transformateurFaces;
    int programme;

    transformateurSommets = chargeTransformateur(GL4.GL_VERTEX_SHADER,codeTransformateurSommets);
    transformateurFaces = chargeTransformateur(GL4.GL_FRAGMENT_SHADER, codeTransformateurFragments);
    programme = gl4.glCreateProgram();
    gl4.glAttachShader(programme, transformateurSommets);
    gl4.glAttachShader(programme, transformateurFaces);
    gl4.glLinkProgram(programme);
    if(programme!=0) {
        résultatEditionLiens=IntBuffer.allocate(1);
        gl4.glGetProgramiv(programme, GL4.GL_LINK_STATUS, résultatEditionLiens);
        if (résultatEditionLiens.get(0) == 0) {
            gl4.glDeleteProgram(programme);
            throw new RuntimeException("Erreur à la création du programme!!");
        } else {
            gl4.glUseProgram(programme);
            gl4.glDeleteShader(transformateurSommets);
            gl4.glDeleteShader(transformateurFaces);
        }
    } else {
        throw new RuntimeException("Erreur à la création du programme!!");
    }

    return(programme);
}

public static int chargeTransformateur(int type, String [] codeTransformateur){
    int transformateur,i,j;
    IntBuffer résultatCompilation;

    transformateur = gl4.glCreateShader(type);
    if(transformateur!=0) {
        // création réussie : lui indiquer le code source
        gl4.glShaderSource(transformateur,codeTransformateur.length,codeTransformateur,null);

        // compiler le code source
        gl4.glCompileShader(transformateur);

        // récupérer le diagnostic de création du shader
        byte [] infoLog=new byte[10000];
        int [] taille=new int[100];
        gl4.glGetShaderInfoLog(transformateur,1000,taille,0,infoLog,0);

        // récupérer le résultat de la compilation
        résultatCompilation=IntBuffer.allocate(1);
        gl4.glGetShaderiv(transformateur,GL4.GL_COMPILE_STATUS,résultatCompilation);
        if(résultatCompilation.get(0)==0) {
            // la compilation a échoué!
            throw new RuntimeException("Erreur à la compilation du shader!!"+"\r\n"+"\r\n"+codeTransformateur+"\r\n"+"\r\n"+infoLog.toString()+"\r\n"+"\r\n"+"\r\n");
        }
    } else {
        // la création est un échec!
        throw new RuntimeException("Erreur à la création du nom du shader!!"+"\r\n"+codeTransformateur);
    }

    return(transformateur);
}
glLinkProgram
返回时,结果是GL\u LINK\u状态设置为false

我的调查:

  • 使用参数
    GL\u COMPILE\u STATUS
    调用
    glGetShaderiv
    会为两个着色器返回true
  • 调用带有参数的
    GL_ATTACHED_着色器的
    glGetProgramiv
    函数时,在第一个附件后返回1,在第二个附件后返回2

知道我做错了什么吗?

主要是,您必须通过设置着色器对象的源代码,而不是通过读取着色器对象的源代码字符串。

实际上,您要做的是编译“空”着色器对象(当然没有任何错误)。但是链接失败,因为顶点着色器不会写入
gl\u位置
(当然,因为它是“空的”)


如果要创建并初始化
vec4
的数组,则正确的语法为:
(见附件)

const vec4顶点[3]=vec4[3](
vec4(0.25,-0.25,0.5,1.0),
vec4(-0.25,-0.25,0.5,1.0),
vec4(0.25,0.25,0.5,1.0));
此外,它区分大小写。它不是
gl\u位置

gl_位置=顶点[gl_顶点ID]

gl_位置=顶点[gl_顶点ID];


我建议通过获取编译错误消息。请参见

您可以使用此命令检索有关链接进程的任何错误/诊断信息。向我提供了以下错误:“n(0):错误C5145:必须写入gl_位置”。我将顶点着色器中的
gl\u位置
更改为
gl\u位置
,但仍然收到相同的错误消息…已经注意到
gl\u位置
中的“p”。通过粘贴代码更正了数组声明:无改进。。。在着色器编译后调用
gl4.glGetShaderInfoLog
会导致
infoLog
仅填充“0”。在着色器的每行末尾添加“\n”:无改进。并且在每次着色器编译后,
glGetError
函数系统地返回0(
GL\u no\u ERROR
)。即使执行了
glEnable(GL4.GL\u DEBUG\u OUTPUT)
,函数
glGetDebugMessageLog
也会返回“0”。使用
glShaderSource
,着色器不会编译,但
glGetShaderInfoLog
的结果现在不清楚:
infoLog.toString
返回[B@780e767d...
private int créeProgrammeOpenGL(){
    IntBuffer résultatEditionLiens;
    int transformateurSommets,transformateurFaces;
    int programme;

    transformateurSommets = chargeTransformateur(GL4.GL_VERTEX_SHADER,codeTransformateurSommets);
    transformateurFaces = chargeTransformateur(GL4.GL_FRAGMENT_SHADER, codeTransformateurFragments);
    programme = gl4.glCreateProgram();
    gl4.glAttachShader(programme, transformateurSommets);
    gl4.glAttachShader(programme, transformateurFaces);
    gl4.glLinkProgram(programme);
    if(programme!=0) {
        résultatEditionLiens=IntBuffer.allocate(1);
        gl4.glGetProgramiv(programme, GL4.GL_LINK_STATUS, résultatEditionLiens);
        if (résultatEditionLiens.get(0) == 0) {
            gl4.glDeleteProgram(programme);
            throw new RuntimeException("Erreur à la création du programme!!");
        } else {
            gl4.glUseProgram(programme);
            gl4.glDeleteShader(transformateurSommets);
            gl4.glDeleteShader(transformateurFaces);
        }
    } else {
        throw new RuntimeException("Erreur à la création du programme!!");
    }

    return(programme);
}

public static int chargeTransformateur(int type, String [] codeTransformateur){
    int transformateur,i,j;
    IntBuffer résultatCompilation;

    transformateur = gl4.glCreateShader(type);
    if(transformateur!=0) {
        // création réussie : lui indiquer le code source
        gl4.glShaderSource(transformateur,codeTransformateur.length,codeTransformateur,null);

        // compiler le code source
        gl4.glCompileShader(transformateur);

        // récupérer le diagnostic de création du shader
        byte [] infoLog=new byte[10000];
        int [] taille=new int[100];
        gl4.glGetShaderInfoLog(transformateur,1000,taille,0,infoLog,0);

        // récupérer le résultat de la compilation
        résultatCompilation=IntBuffer.allocate(1);
        gl4.glGetShaderiv(transformateur,GL4.GL_COMPILE_STATUS,résultatCompilation);
        if(résultatCompilation.get(0)==0) {
            // la compilation a échoué!
            throw new RuntimeException("Erreur à la compilation du shader!!"+"\r\n"+"\r\n"+codeTransformateur+"\r\n"+"\r\n"+infoLog.toString()+"\r\n"+"\r\n"+"\r\n");
        }
    } else {
        // la création est un échec!
        throw new RuntimeException("Erreur à la création du nom du shader!!"+"\r\n"+codeTransformateur);
    }

    return(transformateur);
}