这是我的(非常简单的)着色器:
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。关于我在做什么错的任何想法?
主要是,您必须通过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=vertices[gl_VertexID];