我正在写一个 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);
我已经在另一台装有 Intel 显卡的 PC 上测试了这个应用程序,它也发生在Intel Corporation 4 系列芯片组集成图形 Controller (rev 03),无论设置的过滤模式如何。巧合?
我是不是忘记在 the code 中做些什么了? ,这可能是驱动程序问题吗?我有几台机器使用相同的 Intel 卡,但所有机器都出现了问题。重要的是要声明此问题不会发生在 NVIDIA GeForce 7300 上。
最佳答案
查看源代码,我在着色器中看到以下内容:
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
。
关于c++ - 使用 GL_TEXTURE_MIN_FILTER GL_LINEAR 渲染效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9128982/