所以我決定嘗試用Java編寫一個簡單的OpenGL應用程序,只是爲了看看它與我的其他工作相比如何,而我遇到了着色器拒絕編譯的問題。他們真的無法得到簡單得多,這是我的頂點着色器來證明我的意思:OpenGL Shader編譯問題 - 意外的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;
}
片段着色器也很簡單,所以我不會理會,除非有人問它張貼。當我檢查日誌,我得到以下錯誤(這兩種着色器):
(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。
幫助我堆棧溢出,你是我唯一的希望。
編輯:
按照要求,這裏就是負責裝載和編譯着色器源的功能。另外,當談到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(結束)不實際上在錯誤被逮住,這不會發生,直到執行返回到調用函數和我檢查着色器日誌。可能是相關的,但我也可能會散漫。
嘗試在最後一個括號後面添加空行,有時可能會有所幫助。 – Kromster
這是我嘗試的第一件事情之一,但是當我發佈代碼時它並沒有顯示出來。 – rjacks