В настоящее время я пытаюсь заставить работать загрузчик модели и получаю сообщение об ошибке при привязке новых атрибутов шейдера.
В этот момент я бы опубликовал сообщение об ошибке, но 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, все работает без ошибок.
Ура Феликс