Неверный результат, рисование куба в SharpDX

Я хочу нарисовать куб в SharpDX. И это мой текущий результат:

Куб

Как видите, в какой-то момент части куба обрезаются.

Cube2

Я не знаю, что за настройка неправильная, что это может быть? Мне кажется, что-то не так с перспективой. Я пытался создать вид в перспективе, но у меня не было другого результата, кроме пустого окна.

Вот мой код:

struct Vertex
{
    public Vector4 position;
    public Color4 color;
    //...
}

SharpDX.Direct3D11.Buffer vertexBuffer;
SharpDX.Direct3D11.Buffer projBuffer;

Matrix projMatrix;

Vertex[] vertices;

В этом:

//...
BufferDescription description = new BufferDescription(sizeof(float) * 8 * vertices.Length, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
vertexBuffer = SharpDX.Direct3D11.Buffer.Create(Device, vertices, description);

//To pass projection matrix to shader
projBuffer = new SharpDX.Direct3D11.Buffer(Device, Matrix.SizeInBytes, ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
DeviceContext.VertexShader.SetConstantBuffer(1, projBuffer);

Обновлять:

projMatrix = Matrix.OrthoOffCenterLH(-10, 10, -screenRatio*10, screenRatio*10, 1f, 100f);

//How can i create a perspective view?
//projMatrix = Matrix.PerspectiveFovLH(1f, (float)width/height, 1f, 100f);

projMatrix *= Matrix.Rotation...

DeviceContext.UpdateSubresource(ref projMatrix, projBuffer);

Шейдер:

struct VOut
{
  float4 position : SV_POSITION;
  float4 color    : COLOR;
};

cbuffer meshBuffer : register(b1)
{
  float4x4 projMatrix;
}

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
  VOut output;

  output.position = mul(position, projMatrix);
  output.color = color;

  return output;
}

float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
  return color;
}

Что случилось?


person fedab    schedule 19.05.2014    source источник
comment
(Догадка здесь) Ваша задняя плоскость отсечения слишком близко?   -  person Alex    schedule 19.05.2014
comment
@ Алекс, у меня было IsDepthClipEnabled = true в моем RasterizerStateDescription. Я отключил его, и теперь он работает :) У вас также есть предположения, почему я не могу получить вид в перспективе?   -  person fedab    schedule 19.05.2014
comment
Нет простите. У меня вообще нет опыта работы с этим пакетом. На самом деле, я даже не смотрел ваш код, я просто предположил, основываясь на изображениях, которые вы разместили! :)   -  person Alex    schedule 19.05.2014
comment
@fedab Попробуйте задать этот вопрос на gamedev.stackexchange.com. Там пользователи больше знакомы с библиотеками для разработки игр. Это не значит, что кто-то здесь не знает ответа.   -  person bubbinator    schedule 19.05.2014
comment
Каковы позиции вершин вашего куба и какие преобразования вы применяете перед рендерингом? Простым изменением, которое может сработать, будет изменение ваших ортоплоскостей с (1100) на (0,01,10000). В конечном итоге вы захотите немного подтянуть его, чтобы избежать z-борьбы, но он должен получить рендеринг.   -  person MooseBoys    schedule 20.05.2014
comment
Я не использую SharpDX, но в необработанном DX11 вам нужно будет транспонировать матрицу проекции перед обновлением ресурса шейдера.   -  person Roger Rowland    schedule 20.05.2014


Ответы (1)


Как заметил Алекс: что-то не так с плоскостью отсечения. Я изменил в своем RasterizerStateDescription IsDepthClipEnabled на false. Тогда у меня был полный куб, но не с правильной перспективой.

У моей проблемы с видом в перспективе было несколько причин. Одна из причин заключалась в том, что я не транспонировал матрицу проекции (на это указал Роджер Роуленд).

Я спросил здесь (gamedev.stackexchange.com) и:

Второй заключался в том, что я использовал некоторые преобразования после того, как установил свою перспективу. Это вызвало некоторые странные деформации.

Третья причина заключалась в том, что я указал неправильные координаты куба. Результатом стала неправильная выбраковка.

person fedab    schedule 20.05.2014