OpenGL ES 2.0 / MonoTouch: ошибка компоновщика - PullRequest
1 голос
/ 28 октября 2011

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

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

Шейдер отлично работает при удалении атрибута "normal".При добавлении я получил следующую ошибку из mono (не из 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, она работает без ошибок.

Приветствия Феликса

1 Ответ

2 голосов
/ 29 октября 2011

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

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: «Переменная не используется и игнорируется».

...