Поэтому я решил попробовать написать простое приложение OpenGL с использованием Java, просто чтобы увидеть, как оно сравнивается с другими моими усилиями, и я столкнулся с проблемой, когда мои шейдеры отказываются компилироваться.Они действительно не могли стать намного проще, вот мой вершинный шейдер, чтобы продемонстрировать, что я имею в виду:
//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;
}
Фрагментный шейдер такой же простой, поэтому я не буду его публиковать, если кто-то не попросит об этом.Когда я проверяю логи, я получаю следующую ошибку (для обоих шейдеров):
(0) : error C0000: syntax error, unexpected $end at token "<EOF>"
Я не уверен, что это актуально ... но я разрабатываю для Linux (Ubuntu 11.04), используяДжава.Единственными библиотеками, которые я использую, являются JOGL (для привязок openGL) и стандартная библиотека Java (если это даже имеет значение ...) Моя видеокарта - Nvidia GeForce 9600M GS, и я проверил расширения, и у них есть полная поддержкаOpenGL 3.3.
Помогите мне переполнение стека, вы моя единственная надежда.
РЕДАКТИРОВАТЬ:
По запросу, здесь есть функция, которая отвечает за загрузку и компиляциюшейдерный источник.Кроме того, когда дело доходит до GLSL, я супер n00b, так что я действительно не знаю, что искать, чтобы убедиться, что все правильно отформатировано для OpenGL.Ссылка на недавнее (т.е. посвященное OpenGL 3.x) учебное пособие по этому вопросу будет принята.
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;
}
В качестве отступления, утверждение if ближе к концу, где я проверяю glGetError () не на самом деле, где ошибка обнаружена, это не происходит, пока выполнение не возвращается к вызывающей функции, и я не проверяю журналы шейдеров.Может быть уместно, но опять же я мог бы быть бессвязным.