Monogame: рендеринг только внутри указанной области

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

Примерно так:  введите описание изображения здесь

В основном это позволяет мне рисовать в буфере или texture2D, как обычно, но при этом фактическое рисование происходит только внутри этой указанной области, а оставшиеся пиксели за ее пределами остаются нетронутыми.

Зачем это нужно - я создаю свою собственную систему пользовательского интерфейса, и я бы хотел избежать использования промежуточных буферов, поскольку это довольно медленно, когда на экране много компонентов пользовательского интерфейса (и каждый должен рисовать в своем собственном буфере, чтобы предотвратить дочерние элементы выводится за пределы родительских границ).

И для пояснения - это все для простого 2D-рендеринга, а не для 3D.


person NewProger    schedule 27.12.2018    source источник
comment
Я действительно не понимаю проблемы с пользовательским интерфейсом. Я также написал свою собственную систему пользовательского интерфейса, и у меня возникли проблемы с производительностью. SpriteBatch.Draw работает очень хорошо. Но все равно. Что вам нужно, так это ViewPort, представляющий видимую в данный момент часть экрана. Вы можете просто проверить, находятся ли координаты объекта, который нужно нарисовать, за пределами этого viewPort или нет.   -  person Pavel Slesinger    schedule 02.01.2019
comment
Посмотрите RenderTarget2D.   -  person Charlie Malmqvist    schedule 04.01.2019


Ответы (2)


Если ваш пользовательский интерфейс действительно нарисован с помощью SpriteBatch, вы можете использовать ScissorRectangle

GraphicsDevice.RasterizerState.ScissorTestEnable = true;
spriteBatch.GraphicsDevice.ScissorRectangle = ...

В 3D вы можете выполнить рендеринг в текстуру и нарисовать только ее часть - или с помощью шейдера (на самом деле вы можете просто отправить размеры в качестве параметра и установить для него черный цвет в PixelShader, если пиксель находится за пределами этого прямоугольника (или того, что вы хочу добиться)

person reiti.net    schedule 28.01.2019

Вы можете использовать:

spriteBatch.Draw(yourTexture,
    //where and the size of what you want to draw on screen
    //for example, new Rectangle(100, 100, 50, 50)//position and width, height
    destinationRectangle,
    //the area you want to draw from the original texture
    //for example, new Rectangle(0, 0, 50, 50)//position and width, height
    sourceRectangle,
    Color.White);

Затем он будет рисовать только ту область, которую вы выбрали ранее. Надеюсь это поможет!

person Silver    schedule 27.03.2019