Визуализировать основной Quad на экран? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытался достичь этого довольно долго, но безуспешно;Я рассмотрел несколько важных вопросов здесь, на StackOverflow, но безуспешно;Я также следовал 6 различным учебникам, которые ВСЕ следовали почти одинаковому процессу:

  1. Создание вершин: -1, -1, 0, -1, 1, 0, 1, 1, 0 и 1, -1, 0.
  2. Построить индексы: 0, 1, 2, 0, 2, 3.
  3. Создать буферы Vertex и Index.
  4. Очистить RenderTargetView.
  5. Установить текущий *Шейдеры 1020 * и Pixel.
  6. Обновите постоянные буферы, если они у вас есть.
  7. Визуализируйте квад (см. Ниже).
  8. Промойте и повторите 4 - 8.

Теперь, причина, по которой меня это поднимает по стене, заключается в том, что я могу рендерить гораздо более сложные объекты, такие как:

  • Сферы
  • 3D-линии
  • Вентиляторы

Мой код для создания четырехугольника почти такой же, как у всех остальных:

public class Quad {
    private void SetVertices() {
        float width = Rescale(Size.Width, 0, Application.Width, -1, 1);
        float height = Rescale(Size.Height, 0, Application.Height, -1, 1);
        vertices = new Vertex[] {
            new Vertex(new Vector3(-width, -height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(-width, height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(width, height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(width, -height, 0), Vector3.ForwardLH, Color.White)
        }
        indices = new int[] { 0, 1, 2, 0, 2, 3 };
        vertexBuffer = Buffer.Create(Device3D, BindFlags.VertexBuffer, vertices);
        vertexBinding = new VertexBufferBinding(vertexBuffer, Utilities.SIzeOf<Vertex>(), 0);
        indexBuffer = Buffer.Create(Device3D, BindFlags.IndexBuffer, indices);
        indexCount = indices.Length;
    }
    public void Render() {
        if (shaderResourceView != null)
            context3D.PixelShader.SetShaderResource(0, shaderResourceView);
        context3D.PixelShader.SetSampler(0, samplerState);
        context3D.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
        context3D.InputAssembler.SetVertexBuffers(0, vertexBinding);
        context3D.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);
        context3D.DrawIndexed(totalIndexCount, 0, 0);
    }
}

Примечания

Я использую правую систему координат (по какой-то причине предыдущий разработчик врезал Vector3.ForwardLH в некоторые места, от которых я пока не могу избавиться);если это помогает, и я не могу в настоящее время преобразовать в левую систему координат.


Я что-то здесь упускаю?Почему я не могу воспроизвести базовый квад?


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

1 Ответ

0 голосов
/ 15 декабря 2018

При рендеринге с Direct3D 11 необходимо знать все состояние.Вы не упоминаете, какие настройки BlendState, DepthStencilState или RasterState находятся здесь, что является вероятной причиной, по которой вы не получаете желаемых результатов.

  • Если DepthStencilState является таким набором, используйтеZ-буфер, то тот факт, что ваши вершины имеют 0 для Z, означает, что они будут отбракованы.Вы можете установить состояние глубины / трафарета без Z-записей или Z-тестов, и вам определенно следует отключить Z-записи при рисовании 2D-объектов.Вы также можете передать что-то вроде 0.5 для значения Z для ваших вершин, что довольно часто встречается для 2D-рисования с 3D-API.

  • Если в RasterState включена выборка задней поверхности, топорядок намотки ваших вершин может привести к их пропуску.Вы можете играть с различными порядками намотки или отключить отбраковку.

Здесь также важно, какие у вас есть вершинный шейдер и пиксельный шейдер.Вы не показываете код для установки ваших шейдеров или констант шейдеров, и вы не показываете HLSL.

Вам следует серьезно подумать об использовании класса SharpDX Toolkit SpriteBatch для эффективногоQuad рендеринга или глядя на их источник для этого .

Я знаю, что вы используете SharpDX C #, , но вам может быть полезно увидеть DirectX Tool Kit для DX11 учебник по рисованию 2D фигур.

...