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但我没有问问题: