Поэтому я решил попробовать написать простое приложение 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) с использованием Java. Единственные библиотеки, которые я использую, - это JOGL (для привязок openGL) и стандартная библиотека Java (если это даже считается ...) Моя видеокарта - Nvidia GeForce 9600M GS, и я проверил расширения, и она полностью поддерживает OpenGL 3.3.
Помогите мне Stack Overflow, на вас моя единственная надежда.
РЕДАКТИРОВАТЬ:
По запросу, вот функция, которая отвечает за загрузку и компиляцию исходного кода шейдера. Кроме того, когда дело доходит до 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 () , не на самом деле там, где обнаруживается ошибка, этого не происходит, пока выполнение не вернется к вызывающей функции, и я не проверил журналы шейдера. Это может быть актуально, но опять же, я тоже мог бессвязно.