Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GLSL着色器未编译,没有错误消息_Java_Compilation_Glsl_Lwjgl - Fatal编程技术网

Java GLSL着色器未编译,没有错误消息

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

我正在尝试使用我从LWJGL编写的GLSL着色器。它只是一个简单的基于片段的phong着色器。着色器在过去工作得很好,即使在这台计算机上也是如此。前几天,它突然停止了编译,没有明显的原因。当我尝试编译它并检查信息日志时,我收到以下消息:

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));
}