В XNA / WP7 рисование 2D на 3D создает для меня шаткий 3D рендер - PullRequest
0 голосов
/ 15 декабря 2010

Я пытаюсь выяснить, как работает 3D-рендеринг в XNA, похоже, он очень похож на DirectX, что делает его довольно простым.

Но у меня есть один тип поведения, которого я не ожидал при рисовании спрайтов.

Когда я просто рисую примитив, трехмерный куб, без каких-либо спрайтов, я получаю такой результат: http://i.stack.imgur.com/DQAHg.png

Но когда я пытаюсь нарисовать его поверх 2D-спрайтов (взятых из SpriteBatch) следующим образом:

        SpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
        base.Draw(gameTime);
        SpriteBatch.End();

        shape.Draw(gameTime);

Это результат, который я получаю: http://imgur.com/7QZlj

Что, очевидно, неправильно. Моей первой мыслью было, что это рендеринг с использованием ортографической проекции (по какой-то причине), но я не уверен.

Вот код, который я использую для рисования куба, он почти 1: 1 из примера примитивов XNA (я еще не начал работать над подходящим 3D-фреймворком для игры), поэтому он может быть грязным

            GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;

            // Create camera matrices, making the object spin.
            float time = (float)gameTime.TotalGameTime.TotalSeconds;

            Vector3 cameraPosition = new Vector3(0, 0, 2.5f);

            float aspect = GraphicsDevice.Viewport.AspectRatio;

            float yaw = 3.05f;
            float pitch = 5.34f;
            float roll = 8.396f;

            Matrix world = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll);
            Matrix view = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
            Matrix projection = Matrix.CreatePerspectiveFieldOfView(1, aspect, 1, 10);

            //  currentPrimitive.Draw(world, view, projection, Color.Red);

            // Reset the fill mode renderstate.
            GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;


            Color color = Color.Red;

            // Set BasicEffect parameters.
            basicEffect.World = world;
            basicEffect.View = view;
            basicEffect.Projection = projection;
            basicEffect.DiffuseColor = color.ToVector3();
            basicEffect.Alpha = 1.0f;// color.A / 255.0f;

            GraphicsDevice device = basicEffect.GraphicsDevice;
            device.DepthStencilState = DepthStencilState.Default;


            GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;

            GraphicsDevice graphicsDevice = basicEffect.GraphicsDevice;

            // Set our vertex declaration, vertex buffer, and index buffer.
            graphicsDevice.SetVertexBuffer(vertexBuffer);

            graphicsDevice.Indices = indexBuffer;


            foreach (EffectPass effectPass in basicEffect.CurrentTechnique.Passes)
            {
                effectPass.Apply();

                int primitiveCount = indices.Count / 3;

                graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                                                     vertices.Count, 0, primitiveCount);

            }

Я также должен уточнить, что это не результат spritebatch.begin / spritebatch.end, если я просто начинаю / заканчиваю и ничего не рисую, конечный результат в порядке, но если я рисую шрифт или спрайт, он ломается куб.

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 15 декабря 2010

Мой совет - проверить настройки GraphicsDevice после выполнения вызова метода SpriteBatch.End().Когда вы используете SpriteBatch, он изменяет некоторые состояния рендеринга в GraphicsDevice.Вероятно, стоит сохранить значения GraphicsDevice до SpriteBatch.Begin(), а затем сбросить их после вызовов метода SpriteBatch.End().

...