Java 无效的片段着色器。链接无法继续

Java 无效的片段着色器。链接无法继续,java,android,glsl,shader,fragment-shader,Java,Android,Glsl,Shader,Fragment Shader,在我的项目开始时,我使用简单的字符串用代码填充两个着色器。这看起来像这样: public final static String chunkDefaultVertexInit = "" +constantParameters +"precision mediump float;" +"uniform mat4 mPMatrix;" +"uniform mat4 mVMatrix;" +"uniform mat4 mMMatrix;" +"

在我的项目开始时,我使用简单的字符串用代码填充两个着色器。这看起来像这样:

    public final static String chunkDefaultVertexInit = ""
    +constantParameters
    +"precision mediump float;"

    +"uniform mat4 mPMatrix;"
    +"uniform mat4 mVMatrix;"
    +"uniform mat4 mMMatrix;"
    +"uniform mat4 mMVMatrix;"

    +"attribute vec4 Vertex;"
    +"attribute vec3 Normal;"
    +"attribute vec2 TexCoord;"

    +"varying vec3 normal;"
    +"varying vec2 uv;"
    +"varying vec4 positionM;"
    +"varying vec4 positionMV;";
    etc....
这对我来说很有效,但不是很清楚。所以我想如何让我的代码对每个人来说更干净、更清晰。我的想法是,把我所有的代码放在一个真实的.cc文件中,并将其移动到res/raw文件夹中。一说即成。 我想通过Inputstreams读取代码并将其保存到字符串中。这也很好,所以我给着色器提供了字符串源

所以。。。现在发生了一个问题,正如我所说,我还没有明白。我甚至对自己有点生气,因为我想了一个简单的方法来修复它,但我没有看到它

我甚至展示了我输入的源代码。。。但它看起来是正确的!o、 o

Log.i("Llama3D Shader",shaderCode);
不要担心奇怪的调试ID,它是项目名称

以下是着色器的源代码:

顶点着色器:

碎片着色器:

每次我尝试运行程序时,ShaderlogInfo和ProgramlogInfo都会对我说:

无效的片段着色器。链接无法继续*

我是疯了还是瞎了?!
我希望你知道答案。。。我真的不知道任何。。。请帮帮我

您得到的日志来自程序链接阶段glGetProgramInfoLog

需要调试的是片段着色器日志glGetShaderInfoLog

大致如下:

def _compile(self, source):
    ptr = cast(c_char_p(source), POINTER(c_char))
    glShaderSource(self.id, 1, byref(ptr), None)
    glCompileShader(self.id)
    status = c_int(0)
    glGetShaderiv(self.id, GL_COMPILE_STATUS, byref(status))
    log = self.check()
    print(log),
    if not status.value:
        raise Exception(log)

def check(self):
    length = c_int(0)
    glGetShaderiv(self.id, GL_INFO_LOG_LENGTH, byref(length))
    log = create_string_buffer(length.value)
    glGetShaderInfoLog(self.id, length.value, None, log)
    return log.value
虽然这不是java语言而是python语言,但它应该让您了解如何获取着色器编译日志

在“我的环境”中编译着色器时,我会看到以下日志,这些日志可能对您有用,也可能对您没有用处:

Vertex shader was successfully compiled to run on hardware.
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3 
Fragment shader failed to compile with the following errors:
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3
ERROR: 0:14: error(#143) Undeclared identifier vNormal
WARNING: 0:14: warning(#402) Implicit truncation of vector from size 1 to size 3. 
ERROR: 0:50: error(#143) Undeclared identifier vTexCoord
ERROR: 0:50: error(#216) Vector field selection out of range 'y'
ERROR: error(#273) 4 compilation errors.  No code generated

您获得的日志来自程序链接阶段glGetProgramInfoLog

需要调试的是片段着色器日志glGetShaderInfoLog

大致如下:

def _compile(self, source):
    ptr = cast(c_char_p(source), POINTER(c_char))
    glShaderSource(self.id, 1, byref(ptr), None)
    glCompileShader(self.id)
    status = c_int(0)
    glGetShaderiv(self.id, GL_COMPILE_STATUS, byref(status))
    log = self.check()
    print(log),
    if not status.value:
        raise Exception(log)

def check(self):
    length = c_int(0)
    glGetShaderiv(self.id, GL_INFO_LOG_LENGTH, byref(length))
    log = create_string_buffer(length.value)
    glGetShaderInfoLog(self.id, length.value, None, log)
    return log.value
虽然这不是java语言而是python语言,但它应该让您了解如何获取着色器编译日志

在“我的环境”中编译着色器时,我会看到以下日志,这些日志可能对您有用,也可能对您没有用处:

Vertex shader was successfully compiled to run on hardware.
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3 
Fragment shader failed to compile with the following errors:
WARNING: 0:2: warning(#260) Keyword 'precision' is supported in GLSL 1.3
ERROR: 0:14: error(#143) Undeclared identifier vNormal
WARNING: 0:14: warning(#402) Implicit truncation of vector from size 1 to size 3. 
ERROR: 0:50: error(#143) Undeclared identifier vTexCoord
ERROR: 0:50: error(#216) Vector field selection out of range 'y'
ERROR: error(#273) 4 compilation errors.  No code generated

编译和链接日志说明了什么?如何在eclipse中获得这些编译和链接日志?显然,我还没有看到它们:/这不是Eclipse的责任。着色器编译/链接错误是您必须在代码中检查的内容。它们是着色器运行时编译的一部分。如果存在编译器/链接器错误,则必须使用代码获取并显示它们。我不知道Android和Java如何处理它,但解释了如何在C/C++代码中实现它。是的,好吧,我确实做到了,但日志没有说任何其他内容。它仍然说:无效的片段着色器。链接无法继续。不多多少少。。。它甚至说,当我将Fragmentshader减少为varying和一个gl_FragColor=vec41.0,1.0,1.0,1.0;命令问题可能是其中一个争论?你所说的是不可能的。着色器信息日志肯定没有说链接无法继续,因为着色器不进行链接。那么着色器信息日志对片段着色器说了什么?请发布日志打印代码。编译和链接日志说明了什么?如何在eclipse中获取这些编译和链接日志?显然,我还没有看到它们:/这不是Eclipse的责任。着色器编译/链接错误是您必须在代码中检查的内容。它们是着色器运行时编译的一部分。如果存在编译器/链接器错误,则必须使用代码获取并显示它们。我不知道Android和Java如何处理它,但解释了如何在C/C++代码中实现它。是的,好吧,我确实做到了,但日志没有说任何其他内容。它仍然说:无效的片段着色器。链接无法继续。不多多少少。。。它甚至说,当我将Fragmentshader减少为varying和一个gl_FragColor=vec41.0,1.0,1.0,1.0;命令问题可能是其中一个争论?你所说的是不可能的。着色器信息日志肯定没有说链接无法继续,因为着色器不进行链接。那么着色器信息日志对片段着色器说了什么?请发布日志打印代码。希望我能@Berserker但我没有问问题:希望我能@Berserker但我没有问问题: