- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
void CRenderer::renderToTexture(CTexture &dest, CTexture &src, TRANSFORM tr)
{
int w = src.width();
Concurrency::parallel_for(0, w, [&] (int i)
{
int h = src.height();
for(int j = 0; j < h; j++)
{
COLOR temp = src.pixel(i, j);
if(temp == TRANSPARENT_COLOR) continue;
//scale
float dx = (i-(w/2) + 0.5f)*tr.scale[0];
float dy = (j-(h/2) + 0.5f)*tr.scale[1];
//rotate
float dx2 = dx*tr.cosRot - dy*tr.sinRot;
float dy2 = dx*tr.sinRot + dy*tr.cosRot;
//translate
dx2 += tr.trans[0];
dy2 += tr.trans[1];
//update pixels
float xMin = dx2 - 0.5f*tr.scale[0] + w/2; if(xMin < 0) xMin = 0;
float yMin = dy2 - 0.5f*tr.scale[1] + w/2; if(yMin < 0) yMin = 0;
float xMax = xMin + tr.scale[0]; if(xMax-(int)xMax > 0) xMax++; if(xMax >= dest.width()) xMax = dest.width()-1;
float yMax = yMin + tr.scale[1]; if(yMax-(int)yMax > 0) yMax++; if(yMax >= dest.height()) yMax = dest.height()-1;
for(float ki = xMin; ki <= xMax; ki++) for(float kj = yMin; kj <= yMax; kj++) dest.pixel(ki, kj) = temp;
}
});
}
Писал ручками трансформацию картинок в 2д, вышло без искажений пропорций, но с дырками, уродливо, и просадило фпс в самую жопень!
Kozel 15.06.2016 07:23 # +2
1) Матрицу поворота и вектор сдвига готовим перед циклами, чтобы в цикле было примерно так:
dx = i*cosRot - j*sinRot + deltaX;
dy = i*sinRot + j*cosRot + deltaY;
2) Чтобы не было "с дырками, уродливо", переходим от координат dest в координаты src.
Т. е. преобразование, написанное чуть выше, должно быть преобразованием, обратным заданному.
3) Гуглим тему. Возможно, есть ещё моменты, о которых я не знаю.
bormand 15.06.2016 07:27 # +3
Будет без дырок, но один хер уродливо аля GL_NEAREST. Пикселищи при большом зуме, шум при маленьком...
bormand 15.06.2016 07:35 # +1
Ну или как в древних софтрендерных игрушках - выбирать пиксели с разбросом, чтобы получилось что-то типа dithering'а. Там формулка совсем простая была, а результат вполне няшный.