A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 18531|回复: 21

让GBA的画面再次升级!TeamWei 老兄的ePSXe滤镜的mGBA移植

[复制链接]

精华
0
帖子
16
威望
0 点
积分
16 点
种子
10 点
注册时间
2018-7-24
最后登录
2022-8-28
 楼主| 发表于 2018-7-25 22:01  ·  浙江 | 显示全部楼层 |阅读模式
本帖最后由 堂兄有礼 于 2018-7-28 08:12 编辑

TeamWei 老兄的ePSXe滤镜非常棒!用过的人都应该发现了,这个支持peteopenGL插件的GLSL shader简直让PS一代的画面直接上升了一个台阶!
【原创】ps模拟器最佳画质研究2D+3D更新20180506
这几天我突然发现mGBA也可以挂载GLSL shader,代码书写格式似乎也一样,于是我就按照它的基本格式移植了过去,发现虽然看起来起作用了,但画面其实是错误的,它会随着游戏画面变成纯白色或者纯灰色,我把代码一条条的删减测试,但这些代码似乎都是有关联性,删哪条都会让滤镜失效,所以不得已,只好过来向这里的坛友们求助,是否有人能把这滤镜移植到mGBA?
mGBA的滤镜格式是一个或者若干.fs文件,和一个manifest.ini

我修改使用的manifest.ini如下:
  1. [shader]
  2. name=GPUPETEOGL2
  3. author=endrift
  4. description=A pristine recreation of the illuminated Game Boy Advance SP
  5. passes=1

  6. [pass.0]
  7. fragmentShader=gpuPeteOGL2.fs
  8. blend=1
  9. width=-4
  10. height=-4

  11. [pass.1]
  12. fragmentShader=gpuPeteOGL2slv.fs
  13. width=-4
  14. height=-4

  15. [pass.1.uniform.lightBrightness]
  16. type=float
  17. default=1
  18. readableName=Light brightness

  19. [pass.1.uniform.reflectionBrightness]
  20. type=float
  21. default=0.07
  22. readableName=Reflection brightness

  23. [pass.1.uniform.reflectionDistance]
  24. type=float2
  25. default[0]=0
  26. default[1]=0.025
  27. readableName=Reflection distance
复制代码
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------



下面附上滤镜的代码。
第一个是gpuPeteOGL2.slf
  1. /*
  2.    AA & xBR 2D+3D shader, coded by 2016 guest(r)

  3.    Hyllian's xBR Level 2 shader
  4.    Copyright (C) 2011/2014 Hyllian/Jararaca - sergiogdb@gmail.com

  5.    AA + colors shader
  6.    Copyright (C) 2016 guest(r) - guest.r@gmail.com

  7.    This program is free software; you can redistribute it and/or
  8.    modify it under the terms of the GNU General Public License
  9.    as published by the Free Software Foundation; either version 2
  10.    of the License, or (at your option) any later version.

  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.

  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

  18. */


  19. /*
  20.    2017.11.16, by teamwei

  21.    首先感谢代码的原作者!
  22.    本人在源代码的基础上增加了CRT电视效果、sRGB效果
  23.    加强对2D和3D画面的优化,尽可能做到2D+3D完美结合的画面
  24.    如果对画面不满意,可自行修改代码(部分中文注释)

  25. */


  26. // Color variables (please edit them)

  27. const vec3 c_ch = vec3(1.0,1.0,1.0);  //  rgb color channel intensity
  28. const float threshold = 0.05;        // xBR algorithm threshold (3D -> 0.0....0.05 -> 2D)


  29. uniform sampler2D OGL2Texture;
  30. uniform vec4 OGL2Size;
  31. uniform vec4 OGL2Param;

  32. const vec3 dt = vec3(1.0,1.0,1.0);


  33. //---------------3D画面滤镜效果---------------

  34. vec3 SoftAA (sampler2D OGL2Texture, vec2 texcoord) {

  35.         float offset = 1;
  36.         if (OGL2Size.x > 4096.0) offset = 0.30;

  37.         float x = offset/2048.0;
  38.         float y = offset/1024.0;

  39.         vec4 yx3 = vec4(1.0/4096,1.0/2048,-1.0/4096,-1.0/2048)*0.8;

  40.         vec3 c11 = texture2D(OGL2Texture, texcoord).xyz;
  41.         vec3 s00 = texture2D(OGL2Texture, texcoord + yx3.zw).xyz;
  42.         vec3 s20 = texture2D(OGL2Texture, texcoord + yx3.xw).xyz;
  43.         vec3 s22 = texture2D(OGL2Texture, texcoord + yx3.xy).xyz;
  44.         vec3 s02 = texture2D(OGL2Texture, texcoord + yx3.zy).xyz;
  45.         vec3 c00 = texture2D(OGL2Texture, texcoord + vec2( -x, -y)).xyz;
  46.         vec3 c22 = texture2D(OGL2Texture, texcoord + vec2(  x,  y)).xyz;
  47.         vec3 c20 = texture2D(OGL2Texture, texcoord + vec2(  x, -y)).xyz;
  48.         vec3 c02 = texture2D(OGL2Texture, texcoord + vec2( -x,  y)).xyz;
  49.         vec3 c10 = texture2D(OGL2Texture, texcoord + vec2(0.0, -y)).xyz;
  50.         vec3 c21 = texture2D(OGL2Texture, texcoord + vec2(  x,0.0)).xyz;
  51.         vec3 c12 = texture2D(OGL2Texture, texcoord + vec2(0.0,  y)).xyz;
  52.         vec3 c01 = texture2D(OGL2Texture, texcoord + vec2( -x,0.0)).xyz;     

  53.         float d1=dot(abs(c00-c22),c_ch)+0.001;
  54.         float d2=dot(abs(c20-c02),c_ch)+0.001;
  55.         float hl=dot(abs(c01-c21),c_ch)+0.001;
  56.         float vl=dot(abs(c10-c12),c_ch)+0.001;
  57.         float m1=dot(abs(s00-s22),c_ch)+0.001;
  58.         float m2=dot(abs(s02-s20),c_ch)+0.001;

  59.         vec3 mn1 = min(min(c00,c01),c02);
  60.         vec3 mn2 = min(min(c10,c11),c12);
  61.         vec3 mn3 = min(min(c20,c21),c22);
  62.         vec3 mx1 = max(max(c00,c01),c02);
  63.         vec3 mx2 = max(max(c10,c11),c12);
  64.         vec3 mx3 = max(max(c20,c21),c22);

  65.         mn1 = min(min(mn1,mn2),mn3);
  66.         mx1 = max(max(mx1,mx2),mx3);       

  67.         vec3 t1=(hl*(c10+c12)+vl*(c01+c21)+(hl+vl)*c11)/(3.0*(hl+vl));
  68.         vec3 t2=(d1*(c20+c02)+d2*(c00+c22)+(d1+d2)*c11)/(3.0*(d1+d2));
  69.        
  70.         c11 =.25*(t1+t2+(m2*(s00+s22)+m1*(s02+s20))/(m1+m2));

  71.         vec3 dif1 = abs(c11-mn1) + 0.001*c_ch;
  72.         vec3 dif2 = abs(c11-mx1) + 0.001*c_ch;

  73.         float filterparam = 2.8;      //3D效果等级
  74.        
  75.         dif1=vec3(pow(dif1.x,filterparam),pow(dif1.y,filterparam),pow(dif1.z,filterparam));
  76.         dif2=vec3(pow(dif2.x,filterparam),pow(dif2.y,filterparam),pow(dif2.z,filterparam));

  77.         c11.r = (dif1.x*mx1.x + dif2.x*mn1.x)/(dif1.x + dif2.x);
  78.         c11.g = (dif1.y*mx1.y + dif2.y*mn1.y)/(dif1.y + dif2.y);
  79.         c11.b = (dif1.z*mx1.z + dif2.z*mn1.z)/(dif1.z + dif2.z);

  80.         return c11;
  81. }
  82. //---------------END---------------


  83. //---------------2D画面滤镜效果---------------

  84. #define WP1  8
  85. #define WP2  3
  86. #define WP3 -1.0

  87. const vec3 Y = vec3(.2126, .7152, .0722);

  88. const   vec2 OGLSize    = vec2( 1024.0, 512.0);
  89. const   vec2 OGLInvSize = vec2( 0.0009765625, 0.001953125);
  90. const   vec2 dx         = vec2( 0.0009765625, 0.0);
  91. const   vec2 dy         = vec2( 0.0, 0.001953125 );

  92. float luma(vec3 color)
  93. {
  94.   return dot(color, Y);
  95. }

  96. vec3 bilinear(float p, float q, vec3 A, vec3 B, vec3 C, vec3 D)
  97. {
  98.         return ((1-p)*(1-q)*A + p*(1-q)*B + (1-p)*q*C + p*q*D);
  99. }

  100. vec3 DDTSharp (sampler2D OGL2Texture, vec2 texcoord)
  101. {       
  102.        
  103.         vec2 pos = fract(texcoord*OGLSize)-vec2(0.5, 0.5); // pos = pixel position
  104.         vec2 dir = sign(pos); // dir = pixel direction

  105.         vec2 fp  = fract(texcoord*OGLSize);
  106.         vec2 texcoord1 = texcoord-fp*OGLInvSize + 0.5*OGLInvSize;

  107.         vec2 g1 = dir*dx;
  108.         vec2 g2 = dir*dy;

  109. //    A1 B1
  110. // A0 A  B  B2
  111. // C0 C  D  D2
  112. //    C3 D3

  113.         vec3 A  = texture2D(OGL2Texture, texcoord1       ).xyz;
  114.         vec3 B  = texture2D(OGL2Texture, texcoord1 +g1   ).xyz;
  115.         vec3 C  = texture2D(OGL2Texture, texcoord1    +g2).xyz;
  116.         vec3 D  = texture2D(OGL2Texture, texcoord1 +g1+g2).xyz;

  117.         vec3 A1 = texture2D(OGL2Texture, texcoord1    -g2).xyz;
  118.         vec3 B1 = texture2D(OGL2Texture, texcoord1 +g1-g2).xyz;
  119.         vec3 A0 = texture2D(OGL2Texture, texcoord1 -g1   ).xyz;
  120.         vec3 C0 = texture2D(OGL2Texture, texcoord1 -g1+g2).xyz;

  121.         vec3 B2 = texture2D(OGL2Texture, texcoord1 +2*g1     ).xyz;
  122.         vec3 D2 = texture2D(OGL2Texture, texcoord1 +2*g1+  g2).xyz;
  123.         vec3 C3 = texture2D(OGL2Texture, texcoord1      +2*g2).xyz;
  124.         vec3 D3 = texture2D(OGL2Texture, texcoord1   +g1+2*g2).xyz;

  125.         float a  = luma(A);
  126.         float b  = luma(B);
  127.         float c  = luma(C);
  128.         float d  = luma(D);

  129.         float a1 = luma(A1);
  130.         float b1 = luma(B1);
  131.         float a0 = luma(A0);
  132.         float c0 = luma(C0);

  133.         float b2 = luma(B2);
  134.         float d2 = luma(D2);
  135.         float c3 = luma(C3);
  136.         float d3 = luma(D3);

  137.         float p = abs(pos.x);
  138.         float q = abs(pos.y);

  139.         float k = distance(pos,g1);
  140.         float l = distance(pos,g2);

  141.         float wd1 = WP1*abs(a-d) + WP2*(abs(b-a1) + abs(b-d2) + abs(c-a0) + abs(c-d3)) + WP3*(abs(a1-d2) + abs(a0-d3));
  142.         float wd2 = WP1*abs(b-c) + WP2*(abs(a-b1) + abs(a-c0) + abs(d-b2) + abs(d-c3)) + WP3*(abs(b1-c0) + abs(b2-c3));

  143.         if ( wd1 < wd2 )
  144.         {
  145.                 if (k < l)
  146.                 {
  147.                         C = A + D - B;
  148.                 }
  149.                 else
  150.                 {
  151.                         B = A + D - C;
  152.                 }
  153.         }
  154.         else if (wd1 > wd2)
  155.         {
  156.                 D = B + C - A;
  157.         }

  158.         vec3 color = clamp (bilinear(p, q, A, B, C, D), 0.0, 1.0);

  159.         return color;
  160. }
  161. //---------------END---------------


  162. //---------------CRT电视效果---------------

  163. #define shadowMask 5     //效果等级 1, 2, 3, 4 or 5
  164. #define maskDark 0.92
  165. #define maskLight 1.20

  166. // Shadow mask
  167. vec3 Mask(vec2 pos){
  168.   vec3 mask=vec3(maskDark,maskDark,maskDark);

  169.   // Very compressed TV style shadow mask.
  170.   if (shadowMask == 1) {
  171.     float line=maskLight;
  172.     float odd=0.0;
  173.     if(fract(pos.x/6.0)<0.5)odd=1.0;
  174.     if(fract((pos.y+odd)/2.0)<0.5)line=maskDark;  
  175.     pos.x=fract(pos.x/3.0);
  176.    
  177.     if(pos.x<0.333)mask.r=maskLight;
  178.     else if(pos.x<0.666)mask.g=maskLight;
  179.     else mask.b=maskLight;
  180.     mask*=line;  
  181.   }

  182.   // Aperture-grille.
  183.   else if (shadowMask == 2) {
  184.     pos.x=fract(pos.x/3.0);

  185.     if(pos.x<0.333)mask.r=maskLight;
  186.     else if(pos.x<0.666)mask.g=maskLight;
  187.     else mask.b=maskLight;
  188.   }

  189.   // Stretched VGA style shadow mask (same as prior shaders).
  190.   else if (shadowMask == 3) {
  191.     pos.x+=pos.y*3.0;
  192.     pos.x=fract(pos.x/6.0);

  193.     if(pos.x<0.333)mask.r=maskLight;
  194.     else if(pos.x<0.666)mask.g=maskLight;
  195.     else mask.b=maskLight;
  196.   }

  197.   // VGA style shadow mask.
  198.   else if (shadowMask == 4) {
  199.     pos.xy=floor(pos.xy*vec2(1.0,0.5));
  200.     pos.x+=pos.y*3.0;
  201.     pos.x=fract(pos.x/6.0);

  202.     if(pos.x<0.333)mask.r=maskLight;
  203.     else if(pos.x<0.666)mask.g=maskLight;
  204.     else mask.b=maskLight;
  205.   }
  206.   
  207.         //2018.05.06, by teamwei
  208.         else if (shadowMask == 5) {
  209.                 if(fract(pos.x * 0.5) < 0.5) {
  210.                         mask.g *= 1.4;
  211.                 } else {
  212.                         mask.r *= 1.4;
  213.                         mask.b *= 1.4;
  214.                 }

  215.                 if (mod(pos.y,4.0) > 1.0) {
  216.                         mask *= 1;
  217.                 } else {
  218.                         mask *= 0.72;
  219.                 }
  220.                
  221.                 if (mod(pos.y,2.0) >1.0) mask *= 0.88;
  222.         }
  223.        
  224.   return mask;
  225. }
  226. //---------------END---------------


  227. //---------------sRGB画面效果---------------
  228. const float NTSC      = 0.25;   //效果等级

  229. vec3 ntscrgb_2_xyz( vec3 c ) {

  230.     //Inverse Companding
  231.     vec3 v = vec3( pow( c.r, 2.2 ), pow( c.g, 2.2 ), pow( c.b, 2.2  ) );
  232.     return v *
  233.         mat3(  0.6068909,  0.1735011,  0.2003480,
  234.                0.2989164,  0.5865990,  0.1144845,
  235.                0.0000000,  0.0660957,  1.1162243 );
  236. }

  237. // conversion from XYZ to sRGB Reference White D65 ( color space used by windows )

  238. vec3 xyz_2_srgb( vec3 c ) {

  239.     vec3 v =  c *         
  240.         mat3(  3.2404542, -1.5371385, -0.4985314,
  241.               -0.9692660,  1.8760108,  0.0415560,
  242.                0.0556434, -0.2040259,  1.0572252 );

  243.     //Companding
  244.     v.r = ( v.r > 0.0031308 ) ? (( 1.055 * pow( v.r, ( 1.0 / 2.4 ))) - 0.055 ) : 12.92 * v.r;
  245.     v.g = ( v.g > 0.0031308 ) ? (( 1.055 * pow( v.g, ( 1.0 / 2.4 ))) - 0.055 ) : 12.92 * v.g;
  246.     v.b = ( v.b > 0.0031308 ) ? (( 1.055 * pow( v.b, ( 1.0 / 2.4 ))) - 0.055 ) : 12.92 * v.b;
  247.     return v;
  248. }

  249. vec3 ntscrgb_2_srgb( vec3 c ) {
  250.      return xyz_2_srgb( ntscrgb_2_xyz( c ) );
  251. }
  252. //---------------END---------------



  253. float diff2D (vec2 coord)
  254. {
  255.         vec3 c00 = texture2D(OGL2Texture, coord + 0.25*(-dx-dy)).xyz;
  256.         vec3 c20 = texture2D(OGL2Texture, coord + 0.25*( dx-dy)).xyz;
  257.         vec3 c02 = texture2D(OGL2Texture, coord + 0.25*(-dx+dy)).xyz;
  258.         vec3 c22 = texture2D(OGL2Texture, coord + 0.25*( dx+dy)).xyz;

  259.         vec3 mn  = min(min(c00,c20),min(c02,c22));
  260.         vec3 mx  = max(max(c00,c20),max(c02,c22));

  261.         return dot(mx-mn,dt);
  262. }


  263. void main()
  264. {

  265.         vec2 fp  = fract(gl_TexCoord[0].xy*OGLSize);
  266.         vec2 texcoord = gl_TexCoord[0].xy-fp*OGLInvSize + 0.5*OGLInvSize;
  267.         vec2 locator  = sign(fp-vec2(0.5000000001,0.5000000001));
  268.         float maxdiff = max(max(diff2D(texcoord+locator*dx),diff2D(texcoord+locator*dy)),diff2D(texcoord));

  269.         vec3 color;

  270.         if (maxdiff <= threshold) { color = DDTSharp(OGL2Texture, gl_TexCoord[0].xy+vec2(0.00000001)).xyz;}
  271.         else color = SoftAA(OGL2Texture, gl_TexCoord[0].xy);;

  272.         color = mix(color, ntscrgb_2_srgb( color ), NTSC);   //启用sRGB效果
  273.         color*= Mask(gl_FragCoord.xy);    //启动CRT效果

  274.         gl_FragColor.xyz = color;
  275. }
复制代码
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------
---------------------------------------------------分割线------------------------------------------------------------





第二个是gpuPeteOGL2.slv
  1. /*
  2.    Copyright (C) 2016 guest(r) - guest.r@gmail.com

  3.    This program is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU General Public License
  5.    as published by the Free Software Foundation; either version 2
  6.    of the License, or (at your option) any later version.

  7.    This program is distributed in the hope that it will be useful,
  8.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.    GNU General Public License for more details.

  11.    You should have received a copy of the GNU General Public License
  12.    along with this program; if not, write to the Free Software
  13.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

  14. */

  15. uniform vec4 OGL2Param;

  16. void main()
  17. {
  18.         gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  19.         gl_TexCoord[0] = gl_MultiTexCoord0;
  20. }
复制代码
好了。

精华
0
帖子
4
威望
0 点
积分
4 点
种子
0 点
注册时间
2013-2-1
最后登录
2020-1-16
发表于 2018-7-26 11:33  ·  浙江 | 显示全部楼层
我在找比VBA好的模拟器
mGBA就是?

精华
0
帖子
2447
威望
0 点
积分
2498 点
种子
12 点
注册时间
2005-8-18
最后登录
2024-3-26
发表于 2018-7-26 22:18  ·  广东 | 显示全部楼层
手机上有一个模拟LCD的gl滤镜,效果很好。不知道能不能用在这个上面。

精华
0
帖子
6
威望
0 点
积分
6 点
种子
5 点
注册时间
2010-6-8
最后登录
2022-10-18
发表于 2018-7-27 09:38  ·  江苏 | 显示全部楼层
到琵琶行找“雪舞回风”问问看吧,此人应该是滤镜移植方面的大佬

精华
0
帖子
16
威望
0 点
积分
16 点
种子
10 点
注册时间
2018-7-24
最后登录
2022-8-28
 楼主| 发表于 2018-7-27 21:16  ·  浙江 | 显示全部楼层
好,先记下了,等我可以发私信的时候就去问……

精华
0
帖子
16
威望
0 点
积分
16 点
种子
10 点
注册时间
2018-7-24
最后登录
2022-8-28
 楼主| 发表于 2018-7-27 21:18  ·  浙江 | 显示全部楼层
A-D-A 发表于 2018-7-26 11:33
我在找比VBA好的模拟器
mGBA就是?

目前运行中文游戏还没发现一点问题,如果滤镜能移植,那画面我感觉绝对可以称霸GBA模拟界。

精华
0
帖子
16
威望
0 点
积分
16 点
种子
10 点
注册时间
2018-7-24
最后登录
2022-8-28
 楼主| 发表于 2018-7-27 21:22  ·  浙江 | 显示全部楼层
jzwtxp 发表于 2018-7-26 22:18
手机上有一个模拟LCD的gl滤镜,效果很好。不知道能不能用在这个上面。

TeamWei 老兄的ePSXe滤镜比Myboy自带的滤镜要好。
不但模拟了LCD的栅格特性,而且还能极大程度地对GBA放大画面后普遍出现的锯齿进行平滑,如果打个比喻的话,那就应该是能从掌机画面直接跳跃到街机画面吧。

精华
0
帖子
2447
威望
0 点
积分
2498 点
种子
12 点
注册时间
2005-8-18
最后登录
2024-3-26
发表于 2018-7-28 02:09  ·  辽宁 | 显示全部楼层
/*
   Author: Gigaherz
   License: Public domain
*/

/* COMPATIBILITY
   - HLSL compilers
   - Cg   compilers
   - FX11 compilers
*/

#include "../../compat_includes.inc"
uniform COMPAT_Texture2D(decal) : TEXUNIT0;
uniform float4x4 modelViewProj;

/* configuration (higher values mean brighter image but reduced effect depth) */
const int brighten_scanlines = 16;
const int brighten_lcd = 4;

struct out_vertex
{
        float4 position : COMPAT_POS;
        float2 texCoord : TEXCOORD0;
        float2 omega    : TEXCOORD1;
};

out_vertex main_vertex(COMPAT_IN_VERTEX)
{
#ifdef HLSL_4
        float4 position = VIN.position;
        float2 texCoord = VIN.texCoord;
#endif
        out_vertex OUT;
    OUT.position = mul(modelViewProj, position);
    OUT.texCoord = texCoord;

    OUT.omega = 3.141592654 * 2 * IN.texture_size;
        return OUT;
}

const float3 offsets = 3.141592654 * float3(1.0/2,1.0/2 - 2.0/3,1.0/2-4.0/3);

float4 lcd3x(COMPAT_Texture2D(decal), float2 omega, float2 texCoord)
{
    float3 res = COMPAT_SamplePoint(decal, texCoord).xyz;

    float2 angle = texCoord * omega;
       
    float yfactor = (brighten_scanlines + sin(angle.y)) / (brighten_scanlines + 1);
    float3 xfactors = (brighten_lcd + sin(angle.x + offsets)) / (brighten_lcd + 1);
   
    float3 color = yfactor * xfactors * res;
   
    return float4(color.x, color.y, color.z, 1.0);
}

float4 main_fragment(COMPAT_IN_FRAGMENT) : COMPAT_Output
{
        return lcd3x(decal, VOUT.omega, VOUT.texCoord);
}
COMPAT_END

精华
0
帖子
2447
威望
0 点
积分
2498 点
种子
12 点
注册时间
2005-8-18
最后登录
2024-3-26
发表于 2018-7-28 02:10  ·  辽宁 | 显示全部楼层
这是retroarch里带的lcd3x滤镜的配置信息。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

精华
0
帖子
16
威望
0 点
积分
16 点
种子
10 点
注册时间
2018-7-24
最后登录
2022-8-28
 楼主| 发表于 2018-7-28 07:45  ·  浙江 | 显示全部楼层
jzwtxp 发表于 2018-7-28 02:09
/*
   Author: Gigaherz
   License: Public domain

效果不错,不过锯齿没有任何改善。我用TeamWei 老兄的ePSXe滤镜截个对比图出来你看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2024-4-23 21:20 , Processed in 0.184199 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部