Postanowiłem więc spróbować napisać prostą aplikację OpenGL przy użyciu Javy, tylko po to, aby zobaczyć, jak to jest w porównaniu do innych moich wysiłków, i napotykam problem, w którym moje shadery odmawiają kompilacji. Oni naprawdę nie mógł się o wiele prostsze, oto moja vertex shader w celu wykazania, co mam na myśli:Problem kompilacji Shader OpenGL - nieoczekiwany EOF
//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;
}
Fragment shader jest tak samo proste, więc nie przeszkadza umieszczenie go chyba, że ktoś o to poprosi. Kiedy sprawdzić dzienniki, wrócę następujący błąd (zarówno dla shaderów):
(0) : error C0000: syntax error, unexpected $end at token "<EOF>"
nie jestem pewien, że to ma znaczenie ... ale Zajmuję na Linux (Ubuntu 11.04) przy użyciu języka Java. Jedyne biblioteki, których używam to JOGL (dla wiązań OpenGL) i standardowa biblioteka Java (jeśli to się jeszcze liczy ...) Moja karta graficzna to Nvidia GeForce 9600M GS, a ja sprawdziłem rozszerzenia i mam pełne wsparcie dla OpenGL 3.3.
Pomóż mi przepełnić stos, jesteś moją jedyną nadzieją.
EDIT:
Zgodnie z wnioskiem, o to funkcja, która jest odpowiedzialna za załadunek i kompilowania shaderów źródła. Ponadto, jeśli chodzi o GLSL, jestem super n00b, więc naprawdę nie wiem, czego szukać, jeśli chodzi o upewnienie się, że rzeczy są poprawnie sformatowane dla OpenGL. Chciałbym docenić link do niedawnego (tj. Zajmującego się OpenGL 3.x) samouczka na ten temat.
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;
}
Tak na marginesie, if ku końcowi, gdzie mogę sprawdzić glGetError() nie jest faktycznie gdzie błąd zostanie złapany, że nie zdarza się aż powróci do realizacji funkcji wywołującej i sprawdzić dzienniki modułu cieniującego. To może być istotne, ale znowu mógłbym być chaotyczny.
Spróbuj dodać pustą linię za ostatnim nawiasem, co może czasem pomóc. – Kromster
To była jedna z pierwszych rzeczy, które wypróbowałem, ale nie pojawiły się, kiedy opublikowałem kod. – rjacks