Прозрачность текстур в бета-версии Silverlight 5 (XNA) - PullRequest
0 голосов
/ 20 июня 2011

Я экспериментирую с Silverlight 5 [beta] DrawingSurface

У меня есть 2 изображения (PNG) с прозрачностью, давайте назовем их Im1 и Im2. Изображения отображаются на 2 простых полигона (по 6 вершин в каждом)

Когда я помещаю Im2 поверх Im1, я вижу Im1 через прозрачные части Im2. Когда я помещаю Im1 поверх Im2, я не вижу Im2 и вижу черную область вместо прозрачной.

Я использую AlphaBlend:

device.BlendState = BlendState.AlphaBlend;

И, как вы можете догадаться, Im2 рисуется после Im1.

Что я делаю не так? Проблема с шейдером? Должен ли я вручную управлять Z-буфером?

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Посмотрите на этот ответ здесь .

В принципе, вы не можете использовать буфер глубины с прозрачностью. В буфере глубины нет понятия «смешивание» - пиксель в буфере глубины будет хранить самое верхнее значение - даже если color отрисованного пикселя является полупрозрачным или прозрачным. Все, что находится «под» значением, хранящимся в буфере глубины, пропускается.

Для этого есть два решения: Вы можете использовать альфа-тестирование , чтобы полностью прозрачные пиксели не записывались в буфер глубины (не помогает с полупрозрачными пикселями). Или вы можете отсортировать прозрачные объекты по глубине , чтобы у более близкого многоугольника не было возможности перекрыть более удаленный.

Вы можете выполнить альфа-тестирование в пиксельном шейдере или с помощью AlphaTestEffect (если SL5 поддерживает какой-либо из них?). Сортировка полигонов - это то, что вам нужно реализовать самостоятельно (если вы использовали полную XNA, SpriteBatch может сделать это за вас - но я не думаю, что SL5 имеет этот класс).

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

0 голосов
/ 20 июня 2011

Вам нужно отсортировать прозрачные полигоны по глубине перед рисованием.

Код будет оценивать цвет сначала Im1 (так как он первый в сцене), и в этот момент будетничего за этим так "просвечивай".Затем, когда он оценивает цвет Im2, он не будет обновлять Im1.

. Сортировка полигонов в первую очередь гарантирует, что при оценке цвета у него будет правильный фон.

Я не знаком с XNA, поэтому не могу сказать, есть ли что-то встроенное, но когда нам приходилось делать это в прошлом, нам приходилось делать сортировку самостоятельно.

...