我正在写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像素)正在视频的顶部呈现(图像周围的黑色边框不是渲染的一部分,好吗?!)。根据渲染的图像,线条的颜色也会改变:
使用缩放:
问题不会发生在:
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
我已经在另一台装有英特尔卡的电脑上测试了此应用程序,并且英特尔公司4系列芯片组集成图形控制器(rev 03)也在无论是否设置了过滤模式。巧合?
我忘了在the code做某事,这可能是司机问题吗?我有几台机器使用相同的Intel卡,所有这些都出现了问题。重要的是要声明这个问题不会发生在NVIDIA GeForce 7300上。
答案 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
。