Автор Тема: Отключение сглаживания текстур в Вайсе  (Прочитано 4082 раз)

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 73
  • Репутация: +2/-0
  • Я пытался
    • Просмотр профиля
Попытавшись сделать пиксельные шрифты в Вайсе, я обнаружил, что настройки TXD никоим образом не влияют на отображение шрифта в самой игре - сглаживание все еще на месте. У меня появился вопрос - как это, собственно, убрать?

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Отключение сглаживания текстур в Вайсе
« Ответ #1 : Декабрь 28, 2016, 11:41:49 pm »
Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:

сделать это:


В этом случае никакое игровое сглаживание не будет проблемой:D

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 73
  • Репутация: +2/-0
  • Я пытался
    • Просмотр профиля
Re: Отключение сглаживания текстур в Вайсе
« Ответ #2 : Декабрь 29, 2016, 09:35:23 pm »
Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:

сделать это:


В этом случае никакое игровое сглаживание не будет проблемой:D


Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Отключение сглаживания текстур в Вайсе
« Ответ #3 : Декабрь 30, 2016, 08:03:36 pm »
Код: C++
  1. #include "plugin_vc.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class FontRenderingSettings {
  6. public:
  7.     FontRenderingSettings() {
  8.         patch::SetUChar(0x5787EA, rwFILTERNEAREST);
  9.         patch::SetUChar(0x5788EA, rwFILTERNEAREST);
  10.     }
  11. } plg;

Теперь пример с текстурой, которую показал Shagg.



Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3. #include "game_vc\CFont.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class ImageDraw {
  8. public:
  9.     static RwRaster *LoadRasterFromBMP(char *filepath) {
  10.         RwImage *image = RtBMPImageRead(filepath);
  11.         if (image) {
  12.             int width, height, depth, format;
  13.             RwImageFindRasterFormat(image, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
  14.             RwRaster *raster = RwRasterCreate(width, height, depth, format);
  15.             RwRasterSetFromImage(raster, image);
  16.             RwImageDestroy(image);
  17.             return raster;
  18.         }
  19.         return nullptr;
  20.     }
  21.  
  22.     ImageDraw() {
  23.         static RwRaster *gRaster = nullptr;
  24.         static int savedState;
  25.  
  26.         Events::initRwEvent += [] {
  27.             gRaster = LoadRasterFromBMP(PLUGIN_PATH("image.bmp"));
  28.         };
  29.  
  30.         Events::drawingEvent += [] {
  31.             if (gRaster) {
  32.                 CSprite2d::DrawRect(CRect(0, 0, SCREEN_COORD_MAX_X, SCREEN_COORD_MAX_Y), CRGBA(0, 0, 0, 240));
  33.  
  34.                 static wchar_t tmpText[64];
  35.  
  36.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  37.                 CFont::SetDropShadowPosition(0);
  38.                 CFont::SetBackgroundOff();
  39.                 CFont::SetFontStyle(1);
  40.                 CFont::SetCentreOn();
  41.                 CFont::SetPropOn();
  42.                 CFont::SetCentreSize(SCREEN_COORD_MAX_X);
  43.                 CFont::SetScale(SCREEN_MULTIPLIER(1.2f), SCREEN_MULTIPLIER(2.4f));
  44.  
  45.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  46.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  47.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: NEAREST POINT");
  48.  
  49.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  50.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  51.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: LINEAR");
  52.  
  53.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gRaster);
  54.                 RwRenderStateGet(rwRENDERSTATETEXTUREFILTER, &savedState);
  55.  
  56.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERNEAREST));
  57.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(100.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(600.0f), SCREEN_COORD_TOP(600.0f)),
  58.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  59.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  60.  
  61.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERLINEAR));
  62.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(650.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(1150.0f), SCREEN_COORD_TOP(600.0f)),
  63.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  64.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  65.  
  66.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(savedState));
  67.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nullptr);
  68.             }
  69.         };
  70.  
  71.         Events::shutdownRwEvent += [] {
  72.             if (gRaster)
  73.                 RwRasterDestroy(gRaster);
  74.         };
  75.     }
  76. } plg;
« Последнее редактирование: Декабрь 30, 2016, 09:26:13 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Отключение сглаживания текстур в Вайсе
« Ответ #4 : Декабрь 30, 2016, 10:23:46 pm »
А вот и изящное решение в виде плагина. Круто.



----

Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо
Ну, я и не писал, что это супер решение  ;D Просто рабочее(у меня сплошь и рядом в моддинге так).

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 73
  • Репутация: +2/-0
  • Я пытался
    • Просмотр профиля
Re: Отключение сглаживания текстур в Вайсе
« Ответ #5 : Декабрь 31, 2016, 03:03:00 pm »
Код: C++
  1. #include "plugin_vc.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class FontRenderingSettings {
  6. public:
  7.     FontRenderingSettings() {
  8.         patch::SetUChar(0x5787EA, rwFILTERNEAREST);
  9.         patch::SetUChar(0x5788EA, rwFILTERNEAREST);
  10.     }
  11. } plg;

Теперь пример с текстурой, которую показал Shagg.



Код: C++
  1. #include "plugin_vc.h"
  2. #include "game_vc\CSprite2d.h"
  3. #include "game_vc\CFont.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class ImageDraw {
  8. public:
  9.     static RwRaster *LoadRasterFromBMP(char *filepath) {
  10.         RwImage *image = RtBMPImageRead(filepath);
  11.         if (image) {
  12.             int width, height, depth, format;
  13.             RwImageFindRasterFormat(image, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
  14.             RwRaster *raster = RwRasterCreate(width, height, depth, format);
  15.             RwRasterSetFromImage(raster, image);
  16.             RwImageDestroy(image);
  17.             return raster;
  18.         }
  19.         return nullptr;
  20.     }
  21.  
  22.     ImageDraw() {
  23.         static RwRaster *gRaster = nullptr;
  24.         static int savedState;
  25.  
  26.         Events::initRwEvent += [] {
  27.             gRaster = LoadRasterFromBMP(PLUGIN_PATH("image.bmp"));
  28.         };
  29.  
  30.         Events::drawingEvent += [] {
  31.             if (gRaster) {
  32.                 CSprite2d::DrawRect(CRect(0, 0, SCREEN_COORD_MAX_X, SCREEN_COORD_MAX_Y), CRGBA(0, 0, 0, 240));
  33.  
  34.                 static wchar_t tmpText[64];
  35.  
  36.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  37.                 CFont::SetDropShadowPosition(0);
  38.                 CFont::SetBackgroundOff();
  39.                 CFont::SetFontStyle(1);
  40.                 CFont::SetCentreOn();
  41.                 CFont::SetPropOn();
  42.                 CFont::SetCentreSize(SCREEN_COORD_MAX_X);
  43.                 CFont::SetScale(SCREEN_MULTIPLIER(1.2f), SCREEN_MULTIPLIER(2.4f));
  44.  
  45.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  46.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  47.                 CFont::PrintString(SCREEN_COORD_LEFT(350.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: NEAREST POINT");
  48.  
  49.                 swprintf(tmpText, L"Raster: %dx%dx%d", gRaster->width, gRaster->height, gRaster->depth);
  50.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(620.0f), tmpText);
  51.                 CFont::PrintString(SCREEN_COORD_LEFT(900.0f), SCREEN_COORD_TOP(670.0f), L"Filtering: LINEAR");
  52.  
  53.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gRaster);
  54.                 RwRenderStateGet(rwRENDERSTATETEXTUREFILTER, &savedState);
  55.  
  56.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERNEAREST));
  57.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(100.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(600.0f), SCREEN_COORD_TOP(600.0f)),
  58.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  59.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  60.  
  61.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(rwFILTERLINEAR));
  62.                 CSprite2d::SetVertices(CRect(SCREEN_COORD_LEFT(650.0f), SCREEN_COORD_TOP(100.0f), SCREEN_COORD_LEFT(1150.0f), SCREEN_COORD_TOP(600.0f)),
  63.                     CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255), CRGBA(255, 255, 255, 255));
  64.                 RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
  65.  
  66.                 RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, RWRSTATE(savedState));
  67.                 RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nullptr);
  68.             }
  69.         };
  70.  
  71.         Events::shutdownRwEvent += [] {
  72.             if (gRaster)
  73.                 RwRasterDestroy(gRaster);
  74.         };
  75.     }
  76. } plg;


Спасибо! А можно ли подобным образом ВООБЩЕ отключить сглаживание текстур?

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Отключение сглаживания текстур в Вайсе
« Ответ #6 : Декабрь 31, 2016, 07:02:14 pm »
Найди в игре все вызовы RwRenderStateSet() с параметром rwRENDERSTATETEXTUREFILTER и везде проставь устанавливаемое значение rwFILTERNEAREST.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv