【发布时间】:2011-06-19 06:32:55
【问题描述】:
所以我决定尝试使用 Java 编写一个简单的 OpenGL 应用程序,只是为了看看它与我的其他工作相比如何,我遇到了我的着色器拒绝编译的问题。他们真的再简单不过了,这是我的顶点着色器来证明我的意思:
//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>"
我不确定这是否相关...但我正在使用 Java 在 Linux (Ubuntu 11.04) 上进行开发。我正在使用的唯一库是 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;
}
顺便说一句,我检查 glGetError() 的 if 语句实际上不是错误被捕获的地方,直到执行返回调用函数并且我检查着色器日志。可能是相关的,但话又说回来,我也可能是漫无边际的。
【问题讨论】:
-
尝试在最后一个括号后添加空行,这有时可能会有所帮助。
-
这是我尝试的第一件事,但是当我发布代码时它没有显示出来。