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
会为两个着色器返回trueglGetShaderiv
- 调用带有参数的
GL_ATTACHED_着色器的
函数时,在第一个附件后返回1,在第二个附件后返回2glGetProgramiv
知道我做错了什么吗?主要是,您必须通过设置着色器对象的源代码,而不是通过读取着色器对象的源代码字符串。
看 实际上,您要做的是编译“空”着色器对象(当然没有任何错误)。但是链接失败,因为顶点着色器不会写入
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);
}