2011-10-28 10 views
1

現在、モデルローダを動作させようとしていますが、新しいシェーダ属性をバインドするときにエラーが発生しました。OpenGL ES 2.0/MonoTouch:リンカエラー

この時点で、私はエラーメッセージを表示しますが、MonoTouchはこれをやらせません。私が持っている唯一のものは、フレームワークのテンプレートを使用しているため、 "警告:Could n"という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); 
} 

"_VertexAttributeList.Length"を定数1に置き換えると、エラーなしで動作します。

乾杯 フェリックス

+0

詳細が必要です。リンカのエラーはどうですか?ビルド中に失敗した場合(コピー/ペーストの場合)、ビルド出力が失敗します。追加のデータ/説明が大きすぎてここに収まらない場合は、bugzilla.xamarin.comのバグレポートを記入し、簡単なテストケースを添付してください。 – poupou

+0

エラーpostetはリンカエラー(malloc)ではありません。これはモノ開発のデバッグ出力であり、Gl.LinkProgramを呼び出した後に発生します。ビルド時にはバグもありません。 リンカーのエラーは "警告:Could n"であり、モノのバグのためここでは完全ではありません。 –

答えて

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は、未使用の属性を無視し、属性が「通常は」の場所を持っている-1ことが判明します。

MonoTouchのエラーのために私が読むことができなかったエラーメッセージの意味を知っているので、非常に迷惑なエラーです: "変数は使用されず無視されました"。