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