Привет!
У меня возникла проблема с коректной отрисовкой примитивов, а точнее полигональной сеткой:
На рисунках видно не коректную работу 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);
}
Все по ходу работает нормально:
Ну и естественно подходим к блоку 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???