我正在尝试在 OpenGL 3.2/GLSL 1.5 中实现双三次插值着色器。我已经在运行 OSX 10.7 的 2011 15" MBP 和运行 OSX 10.8 的 2013 27" iMac 上尝试过这个,两者都有类似的问题。
我的着色器程序工作得很好......除了当我的窗口处于特定大小时,某些行和/或像素列奇怪地关闭了。您可以查看此屏幕截图以了解我的意思:http ://angusforbes.com/texcoord_issue.png 。在此图像中,沿 y 轴的 texCoord.x 的值并不总是相同的。
那么,为什么 texcoords 不均匀?也就是说,例如,如果我在 x 轴上沿特定行从 0.0 插值到 1.0,我希望变化的 y 将完全相同。同样,如果沿 y 轴插值,变化的 x 应该是相同的。
但有时他们不是。
这是一些简化(但有效)的示例代码来解释我的意思:
#version 150
uniform sampler2D tex0; //some image I'm trying to do bicubic interpolation on
uniform int tWidth; //width of image;
uniform int tHeight; //height of image
in vec2 texCoord; //my interpolated texture coordinates, 0.0->1.0 in each direction
out vec4 outputFrag;
void main() {
float a = fract( texCoord.x * tWidth );
float b = fract( texCoord.y * tHeight );
outputFrag = vec4( a, b, 0.0, 1.0 );
/*
//it's a little easier to see the issue like this:
if (a > 0.95) {
outputFrag = vec4( a, b, 0.0, 1.0 );
} else {
outputFrag = vec4( 0.0 );
}
*/
}
我试过用以下方式替换fract函数:float a = texCoord.x * tWidth - floor(texCoord.x * tWidth); 只是想看看内置的 fract 方法是否有问题。但它给出了相同的结果。
重要的原因是,当我在特定位置计算的值(基于我的 texCoord)突然变为 0.01 而不是 0.99 或其他值时,它会弄乱我的着色器并导致奇怪的条纹。我试过设置“precision highp float;” 在片段着色器上,但它不能解决问题。我将 GL_NEAREST 用于最小和最大过滤器。
有任何想法吗?或者这是在着色器上插入 texcoords 时发生的正常浮点错误?