Рендеринг текстуры треугольник из вершин и ультрафиолетовых технологийC#

Место общения программистов C#
Ответить
Anonymous
 Рендеринг текстуры треугольник из вершин и ультрафиолетовых технологий

Сообщение Anonymous »

Я пытаюсь отобрать часть листа спермы в новую автономную текстуру. У меня есть треугольники, вершины и ультрафиолетовые координации моего спрайта, но мой код только правильно делает первый треугольник, а не второй. Я подтвердил, что оба треугольника обрабатываются. У меня есть два треугольника (0,3,1) и (2,3,0), образующие квадрат ширины 20% высоты 60% моей текстуры. Оба треугольника определены по часовой стрелке. < /P>
Vertex 2 ---------/Vertex 3
pos [1,1247] / pos [401,1247]
uv [0, 0.6] / uv [0.2, 0.6]
| / |
| / |
| / this |
| / renders|
| / |
Vertex 0 |/__________|Vertex 1
pos [1,1] pos [401,1]
uv [0, 0] uv [0.2, 0]
< /code>
Вот мой метод рендеринга в C#. Для каждого треугольника он смотрит на все возможные положения x и y в своем ограничивающем прямоугольнике, а затем вычисляет вес этого поста, связанный с каждой вершиной. Если вес отрицательный, он находится за пределами треугольника и, таким образом, игнорируется. В противном случае он выбирает текстуру соответственно. < /P>
private void RenderTight(Texture2D texture, Sprite sprite)
{
if (!sprite.texture.isReadable)
{
return;
}

for (int i = 0; i < sprite.triangles.Length; i += 3)
{
var a = sprite.triangles;
var b = sprite.triangles[i + 1];
var c = sprite.triangles[i + 2];

var vertA = sprite.vertices[a] * sprite.pixelsPerUnit;
var vertB = sprite.vertices * sprite.pixelsPerUnit;
var vertC = sprite.vertices[c] * sprite.pixelsPerUnit;

var textureSize = new Vector2(sprite.texture.width, sprite.texture.height);
var uvA = sprite.uv[a] * textureSize;
var uvB = sprite.uv * textureSize;
var uvC = sprite.uv[c] * textureSize;

var minX = Mathf.FloorToInt(Mathf.Min(vertA.x, vertB.x, vertC.x));
var maxX = Mathf.CeilToInt(Mathf.Max(vertA.x, vertB.x, vertC.x));
var minY = Mathf.FloorToInt(Mathf.Min(vertA.y, vertB.y, vertC.y));
var maxY = Mathf.CeilToInt(Mathf.Max(vertA.y, vertB.y, vertC.y));

var cX_bX = vertC.x - vertB.x;
var bY_cY = vertB.y - vertC.y;
var aX_cX = vertA.x - vertC.x;
var denom = (bY_cY * aX_cX) + (cX_bX * aX_cX);

for (int x = minX; x
Для добавленного контекста я делаю это в Unity 2019, что не поддерживает блатинговые сорты с индивидуальной геометрией, или я бы просто сделал это (Idk, если бы современный Unity может сделать это, но 2019 определенно не так). Оригинальный спрайт правильно воспроизводит в игре, так что это не имеет ничего общего с фактическими данными спрайта только с моим методом.


Подробнее здесь: https://stackoverflow.com/questions/797 ... es-and-uvs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»