c++ - 使用 GL_TEXTURE_MIN_FILTER GL_LINEAR 渲染效果不佳

标签 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);

我已经在另一台装有 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/

相关文章:

c++ - Windows文件夹密码

c - 如何让cmd.exe中的GCC显示所有错误

c - 未分配指向 C 样式字符串的指针

OpenGL 本地渲染并通过 SSH 查看

windows - Windows 内部的 OpenGL

c++ - 如何处理 float 下溢?

c++ - 我应该如何与使用 Xcode 的开发人员协作?

c++ - `closed_iota`和 `iota`之间的区别?

c - 查找字符串中的位数时出现错误结果

c++ - 如何通过缓冲区纹理正确地将 16 位整数发送到 GLSL 着色器