我目前正在尝试让我的模型加载器工作,并在绑定新的着色器属性时出错。
此时我会发布错误消息,但MonoTouch不允许我这样做。我唯一得到的是“警告:可以”,似乎是MonoTouch的一个问题,因为我使用了框架的模板。
以下是着色器代码:
<Shader>
<Uniforms>
<Uniform type="mat4" name="modelViewMatrix"/>
</Uniforms>
<Vertex>
<Attributes>
<Attribute type="vec3" name="position" binding="Position"/>
<Attribute type="vec3" name="normal" binding="Normals"/>
<!--<Attribute type="vec4" name="color" binding="Color"/>-->
</Attributes>
<Code><![CDATA[
attribute vec3 position;
attribute vec3 normal;
varying vec4 colorVarying;
uniform mat4 modelViewMatrix;
void main()
{
gl_Position = modelViewMatrix * vec4(position.xyz, 1.0);
float z = gl_Position.z / 100.0;
colorVarying = vec4(z, z, z, 1.0) ;
}
]]></Code>
</Vertex>
<Pixel>
<Code><![CDATA[
varying lowp vec4 colorVarying;
void main()
{
gl_FragColor = colorVarying;
}
]]></Code>
</Pixel>
</Shader>
在删除“普通”属性时,着色器工作正常。添加它时,我在调用GL.LinkProgram后,从单声道(不是来自OpenGL)得到以下错误:
App(553,0xacb752c0) malloc: *** error for object 0x1025a3c4: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
我注意到它与属性绑定有关。这是代码:
// Bind attribute locations
for (int i = 0; i < _VertexAttributeList.Length; i++)
{
ShaderAttribute attribute = _VertexAttributeList[i];
GL.BindAttribLocation(_Program, i, attribute.Name);
}
当我用常量1替换“_VertexAttributeList.Length”时,它没有任何错误。
干杯 菲利克斯
答案 0 :(得分:2)
使用以下代码行后发现错误:
for (int i = 0; i < _VertexAttributeList.Length) {
ShaderAttribute attribute = _VertexAttributeList[i];
Console.WriteLine("Attribute {0} @ {1}", attribute.Name,
GL.GetAttribLocation(_Program, attribute.Name));
}
事实证明,GLSL忽略未使用的属性,属性“normal”的位置为-1。
这是一个非常烦人的错误,因为我现在知道错误消息意味着什么我因为MonoTouch错误而无法读取:“变量未被使用和忽略”。