目前我正在构建一个3D游戏引擎,以便更轻松地编写3D游戏。在我有一台新电脑之前,一切都运转良好。在旧版的Windows Vista电脑上工作得很好,现在我使用的是Windows 8 PC,用于获取着色器统一位置的方法正在给出错误无效操作(1282)。
org.lwjgl.opengl.OpenGLException: Invalid operation (1282)
at org.lwjgl.opengl.Util.checkGLError(Util.java:59)
at org.lwjgl.opengl.GL20.glGetUniformLocation(GL20.java:664)
at lib.ogl.graphicEffects.shaders.shaderProgram.getUniformLocation(shaderProgram.java:50)
at lib.ogl.graphicEffects.shaders.StaticShader.getAllUniformLocations(StaticShader.java:45)
at lib.ogl.graphicEffects.shaders.shaderProgram.<init>(shaderProgram.java:44)
at lib.ogl.graphicEffects.shaders.StaticShader.<init>(StaticShader.java:32)
at lib.org.Engine.engine.run(engine.java:72)
at lib.org.Game.MainClass.main(MainClass.java:37)
我认为链接着色器是一个问题,但我不知道如何测试它或如何修复它。
代码如下所示:
public shaderProgram(String vertexFile, String fragmentFile){
vertexShaderID = loadShader(vertexFile, GL_VERTEX_SHADER);
fragmentShaderID = loadShader(fragmentFile, GL_FRAGMENT_SHADER);
programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
bindAttributes();
glLinkProgram(programID);
if(glGetProgrami(programID, GL_LINK_STATUS)==GL_FALSE){
Debug.Errorlog("failure in linking the shader program");
System.exit(-1);
}
glValidateProgram(programID);
if(glGetProgrami(programID, GL_VALIDATE_STATUS)==GL_FALSE){
Debug.Errorlog("failure in validating the shader program");
System.exit(-1);
}
getAllUniformLocations();
}
loadShader类正确加载着色器。 当程序试图链接我将添加在用于加载着色器的代码中的着色器时出现问题,但它似乎不是问题:
*public static int loadShader(String file, int type){
StringBuilder shaderSource = new StringBuilder();
try{
BufferedReader reader = new BufferedReader (new FileReader(file));
String line;
while((line = reader.readLine())!= null){
shaderSource.append(line).append("\n");
}
reader.close();
}catch(Exception e){
Debug.log("could not load the shader file : " + file);
}
int shaderID = glCreateShader(type);
glShaderSource(shaderID, shaderSource);
glCompileShader(shaderID);
if(glGetShaderi(shaderID,GL_COMPILE_STATUS)==GL_FALSE){
glGetShaderInfoLog(shaderID,500);//TODO DEBUG.log?
Debug.Errorlog("Could not compile the shader");
System.exit(-1);
}
return shaderID;
}
getAllUniformLocations方法如下所示:
protected void getAllUniformLocations() {
try{
location_transformationMatrix = super.getUniformLocation("transformationMatrix");
location_projectionMatrix = super.getUniformLocation("projectionMatrix");
location_viewMatrix = super.getUniformLocation("viewMatrix");
location_shineDamper = super.getUniformLocation("shineDamper");
location_reflectivity = super.getUniformLocation("reflectivity");
location_skyColor = super.getUniformLocation("skyColor");
location_lightPosition = new int[MAX_LIGHTS];
location_lightcolor = new int[MAX_LIGHTS];
location_attenuation = new int [MAX_LIGHTS];
for(int x = 0; x < MAX_LIGHTS; x ++){
location_lightPosition[x] = super.getUniformLocation("lightPosition["+x+"]");
location_lightcolor[x] = super.getUniformLocation("lightColor["+x+"]");
location_attenuation[x] = super.getUniformLocation("attenuation["+x+"]");
}
}catch(Exception e){
e.printStackTrace();
}
}
每次尝试加载第一个制服时,它都会捕获错误并打印我上面提到的堆栈跟踪。
我的旧显卡被忽视了,这可能是个问题吗?
事实证明,真正的问题是在正确编译后,着色器无法链接到程序!
答案 0 :(得分:0)
好的,问题只是我的愚蠢! 在捕获着色器未正确链接后发现信息日志,发现一个着色器中的某些变量与其他着色器中的变量不匹配!
The fragment shader uses varying toCameraVector, but previous shader does not write to it.
Type mismatch: Type of toLightVector different between shaders.
很抱歉浪费每个人的时间,但你确实帮我弄清楚问题是什么,为此,我感谢你,我终于可以解决这个问题了。