Показать сообщение отдельно
Старый 26.03.2011, 18:00   #1
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Лампочка Рисование примитивов XNA

Привет!
У меня возникла проблема с коректной отрисовкой примитивов, а точнее полигональной сеткой:
Нажмите на изображение для увеличения
Название: Image1.jpg
Просмотров: 1245
Размер:	37.6 Кб
ID:	13111Нажмите на изображение для увеличения
Название: Image2.jpg
Просмотров: 1252
Размер:	30.6 Кб
ID:	13112
На рисунках видно не коректную работу AlphaBlending... И еще неверное количество отрисованых треугольников...

Вот код метода построения полигональной сетки:
public Vector3 Initialize3DMesh(int width, int height, int depth)
        {
            vertexDeclaration = new VertexDeclaration(GraphicsDevice, VertexPositionTexture.VertexElements);

            pointListNX = new VertexPositionTexture[depth * 2 * 2];
            pointListNY = new VertexPositionTexture[width * 2 * 2];
            pointListNZ = new VertexPositionTexture[height * 2 * 2];

            for (int ny = 0; ny < depth; ny++)
            {
                for (int nx = 0; nx < 2; nx++)
                {
                    for (int nz = 0; nz < 2; nz++)
                    {
                        pointListNX[(ny * 4) + (nx * 2) + nz] = new VertexPositionTexture(new Vector3((float)nx, (float)(1.0f / depth) * ny, (float)nz), new Vector2((float)nx, (float)nz));
                    }
                }
            }

            for (int nx = 0; nx < width; nx++)
            {
                for (int ny = 0; ny < 2; ny++)
                {
                    for (int nz = 0; nz < 2; nz++)
                    {
                        pointListNY[(nx * 4) + (ny * 2) + nz] = new VertexPositionTexture(new Vector3((float)(1.0f / width) * nx, (float)ny, (float)nz), new Vector2((float)ny, (float)nz));
                    }
                }
            }

            for (int nz = 0; nz < height; nz++)
            {
                for (int nx = 0; nx < 2; nx++)
                {
                    for (int ny = 0; ny < 2; ny++)
                    {
                        pointListNZ[(nz * 4) + (nx * 2) + ny] = new VertexPositionTexture(new Vector3((float)nx, (float)ny, (float)(1.0f / height) * nz), new Vector2((float)nx, (float)ny));
                    }
                }
            }

            triangleStripIndicesNX = LayerBank(depth);
            triangleStripIndicesNY = LayerBank(width);
            triangleStripIndicesNZ = LayerBank(height);

            return new Vector3(width, height, depth);
        }




        private int[] LayerBank(int numberLayers)
        {
            int[] triangleStripIndices = new int[numberLayers * 4];
            for (int y = 0; y < numberLayers; y++)
            {
                for (int i = 0; i < 4; i++)
                {
                    triangleStripIndices[(y * 4) + i] = (y * 4) + i;
                }
            }
            return triangleStripIndices;
        }
Припустим я создаю полигональную сетку 4 х 4 х 4:
        protected override void LoadContent()
        {
                  VolumeMesh = Initialize3DMesh(4, 4, 4);
        }
Все по ходу работает нормально:
Нажмите на изображение для увеличения
Название: Image_1.jpg
Просмотров: 1163
Размер:	68.4 Кб
ID:	13113Нажмите на изображение для увеличения
Название: Image_2.jpg
Просмотров: 1161
Размер:	28.9 Кб
ID:	13114
Ну и естественно подходим к блоку Draw:
        protected override void Draw(GameTime gameTime)
        {
            InitializeTransform(0, rotY, 0);

            GraphicsDevice.Clear(Color.DarkBlue);
            GraphicsDevice.VertexDeclaration = vertexDeclaration;

            GraphicsDevice.RenderState.FillMode = FillMode.Solid;
            GraphicsDevice.RenderState.CullMode = CullMode.None;

            effect.Parameters["WorldViewProj"].SetValue(worldViewProj);
            effect.CurrentTechnique = effect.Techniques["BasicView"];

            GraphicsDevice.RenderState.AlphaBlendEnable = true;
            GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
            GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;

            DrawTriangleStrip(VolumeMesh);
            
            base.Draw(gameTime);
        }




        private void DrawTriangleStrip(Vector3 sizes)
        {
            effect.Begin();
            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                pass.Begin();
                for (int nx = 0; nx < sizes.Y; nx++)
                {
                    GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionTexture>(
                        PrimitiveType.TriangleStrip,
                        pointListNX,
                        nx * 4,  // vertex buffer offset to add to each element of the index buffer
                        4,  // number of vertices to draw
                        triangleStripIndicesNX,
                        nx * 4,  // first index element to read
                        2   // number of primitives to draw
                    );
                }

                for (int ny = 0; ny < sizes.X; ny++)
                {
                    GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionTexture>(
                        PrimitiveType.TriangleStrip,
                        pointListNY,
                        ny * 4,  // vertex buffer offset to add to each element of the index buffer
                        4,  // number of vertices to draw
                        triangleStripIndicesNY,
                        ny * 4,  // first index element to read
                        2   // number of primitives to draw
                    );
                }

                for (int nz = 0; nz < sizes.Z; nz++)
                {
                    GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionTexture>(
                        PrimitiveType.TriangleStrip,
                        pointListNZ,
                        nz * 4,  // vertex buffer offset to add to each element of the index buffer
                        4,  // number of vertices to draw
                        triangleStripIndicesNZ,
                        nz * 4,  // first index element to read
                        2   // number of primitives to draw
                    );
                }
                pass.End();
            }
            effect.End();
        }
Функция пиксель шейдера:
return float4(1,1,1,0.1f);
В принципе DrawTriangleStrip() Должен рисовать 4 х 4 х 4 слоя в сетке. А он рисует 2 х 2 х 2...
Почему так?
И как исправить плохой AlphaBlending???
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием