ФлеймФорумПрограммирование

Запись в текстуру (3 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#30
18:13, 17 июля 2011

Renegade
> А что должно быть?
Нормальный рендер | Запись в текстуру

#31
19:23, 17 июля 2011

kroonk
  Я вывожу перерисованную текстуру через спрайт, на
полигонах не пробовал. Сейчас посмотрю что будет.

#32
19:33, 17 июля 2011

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

#33
0:20, 18 июля 2011

Всё, что-то запредельно невразумительное пошло, решил переписать пиксели в массив:

  BYTE r[128][96], g[128][96], b[128][96], a[128][96];
  BYTE R = 0,  G = 0,  B = 0,  A = 0;
  BYTE R2 = 0, G2 = 0, B2 = 0, A2 = 0;
  BYTE RO = 0, GO = 0, BO = 0, AO = 0;
  D3DLOCKED_RECT lrDst; 
  DWORD Index;
  pRenderTexture->LockRect( 0, &lrDst, 0, 0 ); 
  BYTE* pDst = (BYTE*)lrDst.pBits;
  pRenderTexture->UnlockRect(0);
  for(int h = 1; h < H; h++)
  {
    for(int w = 1; w < W; w++);
    {
      Index = (h*H*4 + w*4);

      B = pDst[Index];
      G = pDst[Index+1];
      R = pDst[Index+2];
      A = pDst[Index+3];

      Index = (h*H*4 + (w+1)*4);

      B2 = pDst[Index];
      G2 = pDst[Index+1];
      R2 = pDst[Index+2];
      A2 = pDst[Index+3];

      BO = (B2 + B) / 2;
      GO = (G2 + G) / 2;
      RO = (R2 + R) / 2;
      AO = (A2 + A) / 2;

      a[w][h] = AO;
      r[w][h] = RO;
      g[w][h] = GO;
      b[w][h] = BO;
    }
  }

Записывается только в переменную a, при попытке записать в r g b вылазиет ошибка приложения, причём неважно что я записываю, даже просто записывание цифры 0 выдаёт ошибку.

#34
0:41, 18 июля 2011

Провёл эксперимент: я могу в эти массивы только один раз записать.

#35
0:42, 18 июля 2011

Попробуй в цикле на 1 пиксель меньше взять. Возможно, что последний пиксель не копируется.

#36
0:53, 18 июля 2011

пробовал взять просто 10 пикселей эффект один и тот же, кстати записывается всё хоть сколько раз и причина ошибки абсолютно непонятна.

#37
1:01, 18 июля 2011

Кажется проблема с тем что я записываю а не с тем куда я записываю: если я буду записывать 0 то всё нормально(странно но этот баг как-то сам по себе исправился), а если пиксели то ошибка приложения.

P.S. Я флаг сменил обратно на RENDERTARGET может он подразумевает что с такой текстурой вообще работать нельзя?

#38
1:13, 18 июля 2011

kroonk
> Я флаг сменил обратно на RENDERTARGET может он подразумевает что с такой
> текстурой вообще работать нельзя?
Точно! Так и думал. Только непойму что мне делать то тогда?

#39
12:12, 18 июля 2011

Сумел таки скопировать одну текстуру в другую, но теперь другой глюк: доступны к записи только маленькие куски текстуры, вот здесь показаны белым те части которые можно менять:
Опять глюки | Запись в текстуру
Как это исправить?

P.S. Копирование сделал с помощью D3DXLoadSurfaceFromSurface но как оказалось эта функция жутко медленная(текстура размером 128x96 заставляет FPS упасть до 30) есть ли какие нибудь аналоги этой функции?

#40
17:54, 18 июля 2011

  Можно нарисовать текстуру RenderTarget, затем перекопировать ее в буфер,
в буфере обработать и затем из буфера переписать ее в Dynamic. Далее вывод
того, что в Dynamic.

#41
20:26, 18 июля 2011

А как это сделать?

#42
20:46, 18 июля 2011

  Сначала рисуем модели в текстуру с флагом D3DUSAGE_RENDERTARGET, по способу от fzr125
Затем блокируем ее pRenderTexture->LockRect, там копируем данные в буфер, потом pRenderTexture->UnLockRect
Далее создаем еще один буфер и из первого переписываем пиксели во второй, преобразовывая их при этом так
как надо.
  Далее создаем текстуру D3DUSAGE_DYNAMIC, такого же размера как и буфер.
Блокируем ее pRenderTexture->LockRect, там копируем буфер в текстуру, потом pRenderTexture->UnLockRect.
Затем рендер.
  Только сколько это займет по времени? Ведь попиксельная обработка достаточно долгая

#43
21:09, 18 июля 2011

  Я в текстуре в 1 кадре меняю 1 пиксель (там где кликнул мышью)
и потому FPS не падает, а тут наверняка будут тормоза.

#44
22:24, 18 июля 2011

Такой способ не будет работать так как я не могу скопировать вообще ничего из текстуры D3DUSAGE_RENDERTARGET через Lock/Unlock.
Renegade
> Я в текстуре в 1 кадре меняю 1 пиксель (там где кликнул мышью)
> и потому FPS не падает, а тут наверняка будут тормоза.
Я пробовал сделать цикл по текстуре 1280x1024 никаких тормозов небыло, но как только я стал использовать D3DXLoadSurfaceFromSurface ФПС стало падать.

Страницы: 1 2 3 4 5 6 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.