使用GL_TEXTURE_MIN_FILTER GL_LINEAR进行渲染错误

时间:2012-02-03 12:55:26

标签: c++ c opengl filter rendering

我正在写application that uses a GLSL fragment shader to do some color conversion to RGB。此应用程序使用GL_TEXTURE_RECTANGLE_ARB,因为我需要支持NPOT纹理。

1280x720 图像呈现较小的表面时会出现问题,例如 640x480

显然,我的 ATI Technologies Inc RV610视频设备[Radeon HD 2400 PRO] 在使用GL_LINEAR执行缩小过滤时出现问题:

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

下图中的红色矩形显示问题的确切位置。绿色线条(高度为4或5像素)正在视频的顶部呈现(图像周围的黑色边框不是渲染的一部分,好吗?!)。根据渲染的图像,线条的颜色也会改变:

enter image description here

使用缩放:

enter image description here

问题不会发生在

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

我已经在另一台装有英特尔卡的电脑上测试了此应用程序,并且英特尔公司4系列芯片组集成图形控制器(rev 03)也在无论是否设置了过滤模式。巧合?

我忘了在the code做某事,这可能是司机问题吗?我有几台机器使用相同的Intel卡,所有这些都出现了问题。重要的是要声明这个问题不会发生在NVIDIA GeForce 7300上

1 个答案:

答案 0 :(得分:2)

查看源代码我在着色器中看到以下内容:

     float CbY = ImgHeight + floor(t.y / 4.0);
     float CrY = ImgHeight + chromaHeight_Half + floor(t.y / 4.0);

我不知道,为什么你将ImgHeight添加到纹理坐标,因为如果它是纹理高度,它所做的就是环绕。然后,您将不同的颜色组件打包到单个纹理中。所以你必须格外小心才能正确计算偏移量。彩色的一条像素高线表示您的纹理坐标错误。 GL_NEAREST强制转换为整数,但GL_LINEAR必须匹配。我建议将floor替换为round