#c# #3d #xna-4.0
#c# #3D #xna-4.0
Вопрос:
Я пытаюсь нарисовать текстурированный quad в XNA, используя пример кода из MSDNhttp://msdn.microsoft.com/en-us/library/bb464051.aspx
но вместо того, чтобы рисовать ее в плоскости XY, я рисую ее в плоскости XZ
Я инициализирую этот quad этим.quad = новый Quad (Вектор3.Ноль, Вектор3.Вверх, Вектор3.Назад, 1, 1);
Я перепробовал почти все комбинации нормального и левого вектора, независимо от того, где нарисован quad, quad полностью черный.
что я здесь делаю не так? теряется ли информация о текстуре, когда я передаю ее по кругу? я неправильно отображаю позиции текстуры?
ps: Текстура, освещение включены.
public class Quad
{
public VertexPositionNormalTexture[] Vertices;
public Vector3 Origin;
public Vector3 Up;
public Vector3 Normal;
public Vector3 Left;
public Vector3 UpperLeft;
public Vector3 UpperRight;
public Vector3 LowerLeft;
public Vector3 LowerRight;
public int[] Indexes;
public Quad(Vector3 origin, Vector3 normal, Vector3 up,
float width, float height)
{
this.Vertices = new VertexPositionNormalTexture[4];
this.Indexes = new int[6];
this.Origin = origin;
this.Normal = normal;
this.Up = up;
// Calculate the quad corners
this.Left = Vector3.Cross(normal, this.Up);
Vector3 uppercenter = (this.Up * height / 2) origin;
this.UpperLeft = uppercenter (this.Left * width / 2);
this.UpperRight = uppercenter - (this.Left * width / 2);
this.LowerLeft = this.UpperLeft - (this.Up * height);
this.LowerRight = this.UpperRight - (this.Up * height);
this.FillVertices();
}
private void FillVertices()
{
Vector2 textureUpperLeft = new Vector2(0.0f, 0.0f);
Vector2 textureUpperRight = new Vector2(1.0f, 0.0f);
Vector2 textureLowerLeft = new Vector2(0.0f, 1.0f);
Vector2 textureLowerRight = new Vector2(1.0f, 1.0f);
for (int i = 0; i < this.Vertices.Length; i )
{
this.Vertices[i].Normal = this.Normal;
}
this.Vertices[0].Position = this.LowerLeft;
this.Vertices[0].TextureCoordinate = textureLowerLeft;
this.Vertices[1].Position = this.UpperLeft;
this.Vertices[1].TextureCoordinate = textureUpperLeft;
this.Vertices[2].Position = this.LowerRight;
this.Vertices[2].TextureCoordinate = textureLowerRight;
this.Vertices[3].Position = this.UpperRight;
this.Vertices[3].TextureCoordinate = textureUpperRight;
this.Indexes[0] = 0;
this.Indexes[1] = 1;
this.Indexes[2] = 2;
this.Indexes[3] = 2;
this.Indexes[4] = 1;
this.Indexes[5] = 3;
}
}
мой метод рисования:
graphicsDevice.BlendState = BlendState.AlphaBlend;
Effect.World = Matrix.Identity;
Effect.View = Camera.View;
Effect.Projection = Camera.Projection;
Effect.TextureEnabled = true;
Effect.Texture = OilTexture;
Effect.EnableDefaultLighting();
Effect.PreferPerPixelLighting = true;
foreach (EffectPass pass in oilEffect.CurrentTechnique.Passes)
{
pass.Apply();
graphicsDevice.DrawUserIndexedPrimitives<VertexPositionNormalTexture>
(PrimitiveType.TriangleList,
Vertices,
0,
4,
Indexes,
0,
2);
}
—я решил свою проблему. что-то пошло не так, когда я передавал texture2d в 3 местах, теперь я рисую его из основного чертежа, и текстура теперь отображается нормально.
Комментарии:
1. Вы говорите, что освещение включено, но настроили ли вы источник, который будет освещать quad? Пожалуйста, опубликуйте код, который отображает quad.
2. Не могли бы вы, пожалуйста, опубликовать свое решение в качестве ответа и принять его, вместо того, чтобы редактировать свой вопрос. Это удалит ее из списка неотвеченных для всех.
Ответ №1:
Есть много причин, по которым quad может быть черным, вот несколько вещей, которые мне нравится делать для отладки:
- Отключите lightning и установите vert color, чтобы убедиться, что ориентация квадрата соответствует моим ожиданиям.
- Используйте образец текстуры, если возможно, чтобы убедиться, что данные текстуры действительны (я получаю много проблем с различными версиями конвейеров, которые не загружают текстуры, потому что форматы были не такими, как я ожидал. В DDS есть подформаты, которые могут быть сложными, если вы создаете свои собственные данные)
- Проверьте, видна ли текстура при выключенном освещении
- Как только вы включите lightning, вы захотите убедиться, что у вас установлены значения lightning для всех вершин
- Попробуйте увеличить значение окружения вашей системы до полного
Если ничего из этого не работает, внимательно посмотрите на область, в которой вы передаете значения vertex lightning, значения vertex normal и освещение вплоть до аппаратного обеспечения.
Комментарии:
1. я запустил этот образец в макетной программе, и он отображается нормально. я не думаю, что я передаю какие-либо значения vertex lightning, где я должен устанавливать?
2. Я только что говорил о . Нормальное значение. Вы правильно передаете ее с помощью набора <VertexPositionNormalTexture> .