Java GLSL着色器未编译,没有错误消息
我正在尝试使用我从LWJGL编写的GLSL着色器。它只是一个简单的基于片段的phong着色器。着色器在过去工作得很好,即使在这台计算机上也是如此。前几天,它突然停止了编译,没有明显的原因。当我尝试编译它并检查信息日志时,我收到以下消息:Java GLSL着色器未编译,没有错误消息,java,compilation,glsl,lwjgl,Java,Compilation,Glsl,Lwjgl,我正在尝试使用我从LWJGL编写的GLSL着色器。它只是一个简单的基于片段的phong着色器。着色器在过去工作得很好,即使在这台计算机上也是如此。前几天,它突然停止了编译,没有明显的原因。当我尝试编译它并检查信息日志时,我收到以下消息: Exception in thread "Thread-1" org.lwjgl.opengl.OpenGLException: Invalid value (1281) at org.lwjgl.opengl.Util.checkGLError(Uti
Exception in thread "Thread-1" org.lwjgl.opengl.OpenGLException: Invalid value (1281)
at org.lwjgl.opengl.Util.checkGLError(Util.java:59)
at org.lwjgl.opengl.GL20.glGetShaderi(GL20.java:542)
at aspect.render.shader.ShaderProgram.getLogInfo(ShaderProgram.java:161)
at aspect.render.shader.ShaderProgram.<init>(ShaderProgram.java:69)
at aspect.render.shader.ShaderProgram.loadPrebuilt(ShaderProgram.java:168)
at aspect.core.AspectLauncher$1.run(AspectLauncher.java:143)
以下是着色器本身:
顶点:
#version 140
uniform int numLights;
uniform bool useLighting;
varying vec3 normal;
varying vec3 ambient;
varying vec3 color;
varying vec3 diffuse[8];
varying vec3 lightDir[8];
varying vec3 dist[8];
varying vec2 texCoord;
void main() {
vec4 position = gl_ModelViewMatrix * gl_Vertex;
gl_Position = gl_ProjectionMatrix * position;
normal = normalize(gl_NormalMatrix * gl_Normal);
texCoord = gl_MultiTexCoord0.st;
color = gl_Color.rgb;
ambient = gl_FrontMaterial.emission.rgb + gl_LightModel.ambient.rgb * gl_FrontMaterial.ambient.rgb;
if (useLighting) {
for (int i = 0; i < numLights; i++) {
float diffuseIntensity;
if (gl_LightSource[i].position.w != 0.0) {
vec3 toLight = (gl_LightSource[i].position - position).xyz;
dist[i] = toLight;
lightDir[i] = normalize(toLight);
diffuseIntensity = dot(normalize(toLight), normal);
} else {
lightDir[i] = normalize(gl_LightSource[i].position.xyz);
diffuseIntensity = dot(normalize(gl_LightSource[i].position.xyz), normal);
}
diffuseIntensity = max(diffuseIntensity, 0.0);
diffuse[i] = gl_FrontMaterial.diffuse.rgb * gl_LightSource[i].diffuse.rgb * diffuseIntensity;
}
}
}
这是单个着色器文件(片段或顶点)的类
失败的线路如下:
ShaderProgram.loadPrebuilt("phong");
文件加载得很好。如果我打印它,它会准确地打印我想要的内容,并且它不会失败,直到我尝试在
ShaderProgram
构造函数中的此代码序列中获取ShaderProgram.java中的日志信息:
if (glGetProgrami(id, GL_LINK_STATUS) == GL_FALSE) {
System.err.println(getLogInfo(id));
id
是一个程序id。将其传递给getLogInfo()
方法:
public static String getLogInfo(int obj) {
return glGetShaderInfoLog(obj, glGetShaderi(obj, GL_INFO_LOG_LENGTH));
}
glGetShaderInfoLog()
和glGetShaderi()
都需要一个着色器id作为第一个参数。要获取有关程序的信息,您需要使用相应的程序调用:
public static String getLogInfo(int obj) {
return glGetProgramInfoLog(obj, glGetProgrami(obj, GL_INFO_LOG_LENGTH));
}
我敢打赌问题不在着色器上,但这恰好是下一次检查GL错误时发生的。@immibis如果我尝试更早地获取日志信息,那么无论发生什么,它都会失败。我的其他着色器编译得很好,只是这一个没有。只有当glGetProgrami(id,GL_LINK_STATUS)==GL_FALSE时,才会运行此行,因此当发生异常时,程序已经无法编译。异常本身似乎是由从无效的着色器程序获取日志引起的,因为出于某种原因,glLinkProgram(id)无法正常工作。哇,好吧,这很有意义。正如您所说,我在ShaderProgram类中更改了getLogInfo方法(并为Shader创建了一个新方法)。现在我可以看到我的着色器出了什么问题(它说没有足够的空间来定义变量),所以我想我现在要查一下。
ShaderProgram.loadPrebuilt("phong");
if (glGetProgrami(id, GL_LINK_STATUS) == GL_FALSE) {
System.err.println(getLogInfo(id));
public static String getLogInfo(int obj) {
return glGetShaderInfoLog(obj, glGetShaderi(obj, GL_INFO_LOG_LENGTH));
}
public static String getLogInfo(int obj) {
return glGetProgramInfoLog(obj, glGetProgrami(obj, GL_INFO_LOG_LENGTH));
}