2013-06-27 132 views
0

我們正在嘗試使用Xamarin製作應用程序,該應用程序將在特定屏幕上的GLKView中擁有一個小型動畫人臉。我們已經尋找渲染精靈的解決方案,並且我們提出的最佳解決方案源自this solution here。即使在GLKView中繪製簡單的圖像,我們也遇到了麻煩,並且error in the output沒有任何意義。我們正在將這個從iOS轉換爲Xamarin C#,因此在某些調用之間存在差異,但我們試圖保持大部分的機制。使用GLK/OpenTK無法渲染圖像

以下是這涉及到代碼的部分:

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(); 
    } 
} 

鏈接整個代碼文件:

回答

1

看起來這個問題在第二次打電話給VertexAttribPointer時只是一個錯字。第二個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"));