【问题标题】:Bad rendering with GL_TEXTURE_MIN_FILTER GL_LINEAR使用 GL_TEXTURE_MIN_FILTER GL_LINEAR 渲染错误
【发布时间】:2012-02-03 12:55:26
【问题描述】:

我正在写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 系列芯片组集成图形控制器(修订版 03),与设置的过滤模式无关。巧合?

我是否忘记在the code 中做某事,这可能是驱动程序问题吗?我有几台具有相同英特尔卡的机器,并且所有机器都出现了问题。请务必声明NVIDIA GeForce 7300 不会发生此问题

【问题讨论】:

  • 我还尝试将GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T 设置为不同的模式,例如GL_CLAMPGL_CLAMP_TO_BORDERGL_CLAMP_TO_EDGE,但没有任何区别。
  • 我怀疑会发生什么。但是有一些源代码,客户端绘图命令和服务器端 GLSL 都会有所帮助。
  • The entire source code is available in this question。该代码唯一需要更改的是将GL_TEXTURE_MIN_FILTER 设置为GL_LINEAR 的调用。
  • 我们也可以去聊天,如果您更容易的话,我可以按照您的指示进行测试。

标签: c++ c opengl filter rendering


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2013-04-16
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多