OpenGL ES 2.0/MonoTouch: ошибка компоновщика

В настоящее время я пытаюсь заставить работать загрузчик модели и получаю сообщение об ошибке при привязке новых атрибутов шейдера.

В этот момент я бы опубликовал сообщение об ошибке, но 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>

Шейдер отлично работает при удалении атрибута «нормальный». При его добавлении я получил следующую ошибку от моно (не от OpenGL) после вызова GL.LinkProgram:

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

Когда я заменяю "_VertexAttributeList.Length" на константу 1, все работает без ошибок.

Ура Феликс


person Felix K.    schedule 28.10.2011    source источник
comment
Нам понадобится больше деталей. Как это ошибка компоновщика? он не работает во время сборки (если это так, скопируйте / вставьте) вывод сборки. Если дополнительные данные/объяснения слишком велики, чтобы поместиться здесь, пожалуйста, заполните отчет об ошибке на bugzilla.xamarin.com и прикрепите простой тестовый пример.   -  person poupou    schedule 28.10.2011
comment
Сообщение об ошибке не является ошибкой компоновщика ( malloc ). Это выходные данные отладки моноразработки, которые появляются после вызова Gl.LinkProgram. Также нет ошибок во время сборки. Ошибка компоновщика WARNING: Может и не полная здесь из-за моно бага.   -  person Felix K.    schedule 28.10.2011


Ответы (1)


Я обнаружил ошибку после использования следующих строк кода:

for (int i = 0; i < _VertexAttributeList.Length) {
    ShaderAttribute attribute = _VertexAttributeList[i];
    Console.WriteLine("Attribute {0} @ {1}", attribute.Name,
                      GL.GetAttribLocation(_Program, attribute.Name));
}

Оказывается, GLSL игнорирует неиспользуемые атрибуты, а атрибут «нормальный» имеет позицию -1.

Это была очень досадная ошибка, потому что теперь я знаю, что означает сообщение об ошибке, которое я не мог прочитать из-за ошибки MonoTouch: «Переменная не используется и игнорируется».

person Felix K.    schedule 29.10.2011