无法成功链接OpenGL程序

问题描述 投票:2回答:1

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

protected String [] codeTransformateurSommets = {
    "#version 400 core",
    "void main(void) {",
        "const vec4 vertices[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_position=vertices[gl_VertexID];",
    "}"
};

protected String [] codeTransformateurFragments = {
    "#version 400 core",
    "out vec4 color;",
    "void main(void) {",
        "color=vec4(1.0,0.0,0.0,1.0);",
    "}"
};

这是我尝试获取程序的方式:

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_LINK_STATUS设置为false。

我的调查:

  • 使用参数glGetShaderiv调用GL_COMPILE_STATUS对于两个着色器均返回true。
  • 使用参数glGetProgramiv调用GL_ATTACHED_SHADERS函数在第一个附件之后返回1,在第二个附件之后返回2。

关于我在做什么错的任何想法?

java eclipse opengl glsl shader
1个回答
0
投票

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

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


如果要创建和初始化Java Code Examples for com.jogamp.opengl.GL2.glShaderSource()的数组,则正确的语法是:(请参见gl_Position

vec4

此外,Array constructors区分大小写。它是const vec4 vertices[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)); 而不是OpenGL Shading Language (GLSL)

gl_Position

gl_Position

我建议通过gl_position获取编译错误消息。参见gl_position=vertices[gl_VertexID];

© www.soinside.com 2019 - 2024. All rights reserved.