【发布时间】:2011-06-29 17:50:01
【问题描述】:
我使用这个 Fragent 着色器(灵感来自前段时间在 NVIDIA 网站上找到的一些教程)。它基本上计算 2D 纹理的双线性插值。
uniform sampler2D myTexture;
uniform vec2 textureDimension;
#define texel_size_x 1.0 / textureDimension[0]
#define texel_size_y 1.0 / textureDimension[1]
vec4 texture2D_bilinear( sampler2D texture, vec2 uv)
{
vec2 f;
uv = uv + vec2( - texel_size_x / 2.0, - texel_size_y / 2.0);
f.x = fract( uv.x * textureDimension[0]);
f.y = fract( uv.y * textureDimension[1]);
vec4 t00 = texture2D( texture, vec2(uv));
vec4 t10 = texture2D( texture, vec2(uv) + vec2( texel_size_x, 0));
vec4 tA = mix( t00, t10, f.x);
vec4 t01 = texture2D( texture, vec2(uv) + vec2( 0, texel_size_y));
vec4 t11 = texture2D( texture, vec2(uv) + vec2( texel_size_x, texel_size_y));
vec4 tB = mix( t01, t11, f.x);
vec4 result = mix( tA, tB, f.y);
return result;
}
它看起来非常简单和严格。我最近在几张 ATI 卡(最新驱动程序...)上对其进行了测试,结果如下:
(左:最近的邻居)(右:正在使用的分片)
如您所见,出现了一些水平和垂直线,重要的是要提到这些在视口坐标中和纹理坐标中都不是固定的。
我必须移植几个着色器以使它们在 ATI 卡上正常工作,看起来 NVIDIA 的实现对 不好 更宽松我写了一段时间的代码。但在这种情况下,我看不出我应该改变什么!
关于克服这个问题的 NVIDIA 和 ATI GLSL 实现之间的差异,我应该知道什么?
【问题讨论】:
-
你能重现 Mesa 的问题吗?
-
@genpfault 我忘了说目标操作系统是 windows 7/Vista/XP ... mesa 驱动程序可用于这些吗?
-
是的。仅限软件,但就是这样。
-
差异?是的,nVidia 的 OpenGL 驱动程序可以工作,ATI 不能。
标签: c++ opengl nvidia shader ati