OpenGL ES 2.0 / MonoTouch:链接器错误

时间:2011-10-28 11:41:36

标签: iphone opengl-es xamarin.ios opengl-es-2.0 shader

我目前正在尝试让我的模型加载器工作,并在绑定新的着色器属性时出错。

此时我会发布错误消息,但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”时,它没有任何错误。

干杯 菲利克斯

1 个答案:

答案 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错误而无法读取:“变量未被使用和忽略”。