GTA Builder Форум

GTA Vice City => Идеи => Тема начата: ilufir от Декабрь 28, 2016, 09:28:21 pm

Название: Отключение сглаживания текстур в Вайсе
Отправлено: ilufir от Декабрь 28, 2016, 09:28:21 pm
Попытавшись сделать пиксельные шрифты в Вайсе, я обнаружил, что настройки TXD никоим образом не влияют на отображение шрифта в самой игре - сглаживание все еще на месте. У меня появился вопрос - как это, собственно, убрать?
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: Shagg_E от Декабрь 28, 2016, 11:41:49 pm
Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:
(http://i51.tinypic.com/2lx73o6.jpg)
сделать это:
(https://cdn.instructables.com/FZR/YCYM/IN0TKHPK/FZRYCYMIN0TKHPK.SQUARE3.jpg)

В этом случае никакое игровое сглаживание не будет проблемой:D
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: ilufir от Декабрь 29, 2016, 09:35:23 pm
Я знаю только один способ(через ж, как всегда) - "эмуляция" "пиксельности" текстур(шрифтов): изначально саму текстуру делать высокого разрешения, но низкой детализации, т.е., из этого:
([url]http://i51.tinypic.com/2lx73o6.jpg[/url])
сделать это:
([url]https://cdn.instructables.com/FZR/YCYM/IN0TKHPK/FZRYCYMIN0TKHPK.SQUARE3.jpg[/url])

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


Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: DK от Декабрь 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.

(http://i.imgur.com/UlyU6mWl.png) (http://i.imgur.com/UlyU6mW.png)

Код: 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;
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: Shagg_E от Декабрь 30, 2016, 10:23:46 pm
А вот и изящное решение в виде плагина. Круто.



----

Ну это уже костыли. Увы, хоть оно и работает, появляется такая проблема, как утечки памяти - из-за этого теряется стабильность. А этого нам не надо
Ну, я и не писал, что это супер решение  ;D Просто рабочее(у меня сплошь и рядом в моддинге так).
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: ilufir от Декабрь 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.

([url]http://i.imgur.com/UlyU6mWl.png[/url]) ([url]http://i.imgur.com/UlyU6mW.png[/url])

Код: 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;


Спасибо! А можно ли подобным образом ВООБЩЕ отключить сглаживание текстур?
Название: Re: Отключение сглаживания текстур в Вайсе
Отправлено: DK от Декабрь 31, 2016, 07:02:14 pm
Найди в игре все вызовы RwRenderStateSet() с параметром rwRENDERSTATETEXTUREFILTER и везде проставь устанавливаемое значение rwFILTERNEAREST.