我使用这个框架着色器(灵感从一些教程中发现在NVIDIA网站一段时间前)。它基本上是计算二维纹理的双线性插值。
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实现之间的差异,我有什么一般性的认识来克服这一点?
发布于 2011-06-29 21:35:11
据我所知,在对纹理进行采样之前,您没有量化纹理坐标。这很可能是这些线条出现的原因,因为您的输入纹理坐标正好位于纹理之间的边界上。所以你首先需要量化uv到纹理中心。请记住,纹理坐标0和1并不位于纹理中心,而是定义了网格的边界,网格单元是(texel_n + 0.5) / texture_dim,纹理中心位于texelFetch,或者使用GLSL函数texelFetch可用的GLSL 1.30及更高版本。
发布于 2011-06-29 18:01:51
nVidia更宽容,例如nVidia允许您错误地抛出(即float4浮点数),只使它成为警告,ATI不会(错误)。如果使用OpenGL,与使用DirectX相比有更大的区别,例如,我有一个相当复杂的顶点着色器(矩阵调色板剥皮),即使没有丝毫警告,它也不适用于ATI (但在nVidia上却起作用)。
因此,如果您不想让着色器“无处不在”工作,就可以获得ATI卡:-) (或者更好的是,集成芯片组^^)。
https://stackoverflow.com/questions/6525030
复制相似问题