0

Xamarin を使用して、特定の画面の GLKView に小さなアニメーションの顔を持つアプリを作成しようとしています。私たちはスプライトをレンダリングするための解決策を探してきまし。GLKView で単純な画像を描画することさえ困難であり、出力のエラーは実際には意味がありません。これを iOS から Xamarin C# に変換しているため、特定の呼び出しには違いがありますが、ほとんどの部分をそのまま維持しようとしました。

これが関連するコードの部分は次のとおりです。

public class Sprite : NSObject
{
    public void Render()
    {
        Effect.Texture2d0.GLName = TextureInfo.Name;
        Effect.Texture2d0.Enabled = true;

        Effect.PrepareToDraw();

        GL.EnableVertexAttribArray((int)GLKVertexAttrib.Position);
        GL.EnableVertexAttribArray((int)GLKVertexAttrib.TexCoord0);

        IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(Quad));
        Marshal.StructureToPtr(Quad, ptr, false);
        int offset = (int)ptr;

        GL.VertexAttribPointer((uint)GLKVertexAttrib.Position, 2, VertexAttribPointerType.Float, false, Marshal.SizeOf(typeof(TexturedVertex)), offset + (int)Marshal.OffsetOf(typeof(TexturedVertex), "geomertryVertex"));
        GL.VertexAttribPointer((uint)GLKVertexAttrib.Position, 2, VertexAttribPointerType.Float, false, Marshal.SizeOf(typeof(TexturedVertex)), offset + (int)Marshal.OffsetOf(typeof(TexturedVertex), "textureVertex"));

        GL.DrawArrays(BeginMode.TriangleStrip, 0, 4);

        Marshal.FreeHGlobal(ptr);
    }
}

Sprite.Render() は、この GLKViewController で次のように呼び出されます。

public class AnimationViewController : GLKViewController
{
    GLKView animationView;
    EAGLContext context;
    Sprite player;
    GLKBaseEffect effect;

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        context = new EAGLContext(EAGLRenderingAPI.OpenGLES2);

        if (context == null)
            Console.WriteLine("Failed to create ES context...");

        animationView = new GLKView(new RectangleF(UIScreen.MainScreen.Bounds.Width * 0.05f,
                                          UIScreen.MainScreen.Bounds.Height * 0.05f,
                                          UIScreen.MainScreen.Bounds.Width * 0.9f,
                                          UIScreen.MainScreen.Bounds.Height * 0.75f), context);

        EAGLContext.SetCurrentContext(context);

        animationView.DrawInRect += new EventHandler<GLKViewDrawEventArgs>(animationView_DrawInRect);

        View.AddSubview(animationView);

        effect = new GLKBaseEffect();
        Matrix4 projectionMatrix = Matrix4.CreateOrthographicOffCenter(0, animationView.Frame.Width, 0, animationView.Frame.Height, -1024, 1024);
        effect.Transform.ProjectionMatrix = projectionMatrix;
        player = new Sprite(@"Player.png", effect);
    }

    void animationView_DrawInRect(object sender, GLKViewDrawEventArgs e)
    {
        GL.ClearColor(0.98f, 0.98f, 0.98f, 1.0f);
        //GL.Clear((uint)(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit));
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
        GL.Enable(EnableCap.Blend);

        player.Render();
    }
}

コード ファイル全体へのリンク:

4

1 に答える 1

1

問題は、 への 2 回目の呼び出しの単なるタイプミスのようVertexAttribPointerです。2番目GLKVertexAttrib.Positionは代わりに次のようにする必要がありますGLKVertexAttrib.TexCoord0:

GL.VertexAttribPointer((uint)GLKVertexAttrib.Position, 2, VertexAttribPointerType.Float, false, Marshal.SizeOf(typeof(TexturedVertex)), offset + (int)Marshal.OffsetOf(typeof(TexturedVertex), "geomertryVertex"));
GL.VertexAttribPointer((uint)GLKVertexAttrib.TexCoord0, 2, VertexAttribPointerType.Float, false, Marshal.SizeOf(typeof(TexturedVertex)), offset + (int)Marshal.OffsetOf(typeof(TexturedVertex), "textureVertex"));
于 2013-07-08T18:46:05.297 に答える