Así que decidí intentar escribir una aplicación OpenGL simple usando Java, solo para ver cómo se comparaba con mis otros esfuerzos, y me encontré con un problema donde mis sombreadores se niegan a compilar. Que realmente no podía conseguir mucho más simple, aquí está mi sombreado de vértices para demostrar lo que quiero decir:Problema de compilación de OpenGL Shader - EOF inesperado
//Minimal vertex shader
#version 330
in vec3 in_Position;
in vec3 in_Color;
out vec3 var_Color;
void main(void)
{
gl_Position = vec4(in_Position, 1.0);
var_Color = in_Color;
}
El fragmento shader es tan simple, por lo que no se molestan en publicar a menos que alguien lo solicite. Cuando compruebo los registros, que vuelva el siguiente error (tanto para los shaders):
(0) : error C0000: syntax error, unexpected $end at token "<EOF>"
No estoy seguro de que esto es relevante ... pero estoy desarrollando en Linux (Ubuntu 11.04) utilizando Java. Las únicas bibliotecas que estoy usando son JOGL (para los enlaces de OpenGL) y la biblioteca estándar de Java (si eso cuenta ...) Mi tarjeta gráfica es una Nvidia GeForce 9600M GS, y verifiqué las extensiones y tiene soporte completo para OpenGL 3.3.
Ayuda para Stack Overflow, eres mi única esperanza.
EDIT:
Conforme a lo solicitado, aquí es la función que se encarga de cargar y compilar el código fuente de sombreado. Además, cuando se trata de GLSL, soy un super n00b, así que realmente no sé qué buscar para asegurarme de que las cosas estén formateadas adecuadamente para OpenGL. Se agradecerá un enlace a un tutorial reciente (es decir, que trata sobre OpenGL 3.x) sobre el tema.
private int CreateCompiledShader(File source, int shader, GL3 gl){
int shaderloc = gl.glCreateShader(shader);
BufferedReader input = null;
ArrayList<String> lines = new ArrayList<String>();
ArrayList<Integer> lengths = new ArrayList<Integer>();
try{
input = new BufferedReader(new FileReader(source));
String buffer;
while(input.ready()){
buffer = input.readLine();
lines.add(buffer);
lengths.add(buffer.length());
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
int[] iLengths = new int[lengths.size()];
for(int i = 0; i < lengths.size(); i++){
iLengths[i] = lengths.get(i).intValue();
}
gl.glShaderSource(shaderloc, lines.size(), lines.toArray(new String[0]), iLengths, 0);
gl.glCompileShader(shaderloc);
int error = gl.glGetError();
if(error != GL3.GL_NO_ERROR){
Logger.log(new GLU().gluErrorString(error), Logger.ERROR, "Shader compilation");
}
return shaderloc;
}
Como acotación al margen, la sentencia if hacia el final donde puedo comprobar glGetError() no es en realidad donde el error se ve atrapado, que no se produce hasta la ejecución vuelve a la función de llamada y verifico el sombreador registra. Podría ser relevante, pero también podría estar divagando.
Intente agregar línea vacía después del último corchete, que a veces podría ayudar. – Kromster
Esa fue una de las primeras cosas que intenté, sin embargo, no apareció cuando publiqué el código. – rjacks