Хорошо, поэтому я делаю движок 3D-рендеринга на чистом javascript, конечно, в качестве задачи - проверить свои навыки линейной алгебры. Я не использую webgl, поэтому, пожалуйста, не говорите "используйте webgl".
В любом случае, программное обеспечение примет треугольники, камеру и локальные преобразования и отобразит данные на экране (я даже сделал это интерактивным).
Однако есть только 6 строк кода рендеринга, а именно:
// some shading and math calculations then this:
context.fillStyle = color;
context.strokeStyle = color;
context.beginPath();
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.lineTo(x2, y2);
context.lineTo(x0, y0);
context.closePath();
context.fill();
context.stroke();
И хотя это работает, на моем Chromebook скорость падает до 10 кадров в секунду с 4k+ лицами. (60 кадров в секунду на обычном компьютере)
В любом случае, это выводит это:
Но чтобы сделать это быстрее, а также из-за того, что изменения состояния холста происходят медленно, я удалил обводку, сделав код рендеринга:
// some shading and math calculations then this:
context.fillStyle = color;
//context.strokeStyle = color;
context.beginPath();
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.lineTo(x2, y2);
context.lineTo(x0, y0);
context.closePath();
context.fill();
//context.stroke();
который работает в два раза быстрее, но в результате на экране отображается следующее: (другая модель)
который имеет уродливые линии повсюду по краям треугольников (которые удаляются, когда я снова добавляю штрих)
Тем не менее, fps удваивается, а прирост производительности велик...
Поэтому я считаю, что линии вызваны тем, что заливка холста не включает область, где она должна быть обведена (как вы можете сказать, контур).
Я пытался исправить это с помощью математики, и хотя это работает, есть некоторые крайние случаи, когда это не так.
Итак, мой вопрос заключается в следующем: Есть ли способ сделать так, чтобы контекстная заливка включала область обводки без обводки, потому что это очень дорого?