如何在OpenGL的GLSL中重复3x9纹理?

1 投票
1 回答
1819 浏览
提问于 2025-04-16 00:45

我有一个纹理,它有一个3x9的重复部分。我不想存储我现有的1920x1080的纹理图像,我更希望能通过代码生成它,这样在其他分辨率下也能正确应用。有没有什么好主意?原始纹理在这里:http://img684.imageshack.us/img684/6282/matte1.png

我知道这个纹理不是2的幂,所以我必须在着色器中进行重复处理,我已经这样做了:

    uniform sampler2D tex;
    varying vec2 texCoord;

    void main() {
      gl_FragColor = texture2D(tex, mod(texCoord, vec2(3.0, 9.0)) * vec2(0.75, 0.5625));
    }

这是我绘制四边形的方式:

      glBegin(GL_QUADS)

      glColor4f(1.0, 1.0, 1.0, 1.0)
      glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.topLeft().x(), self.widgetPhysicalRect.topLeft().y())
      glVertex2f(-1.0, 1.0)
      glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.topRight().x(), self.widgetPhysicalRect.topRight().y())
      glVertex2f(1.0, 1.0)
      glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.bottomRight().x(), self.widgetPhysicalRect.bottomRight().y())
      glVertex2f(1.0, -1.0)
      glMultiTexCoord2f(GL_TEXTURE1, self.widgetPhysicalRect.bottomLeft().x(), self.widgetPhysicalRect.bottomLeft().y())
      glVertex2f(-1.0, -1.0)

      glEnd()

任何建议都非常感谢。

谢谢!

1 个回答

4

这就像你用固定管道做的一样。在设置采样器的统一变量和纹理坐标之前,先把你绑定的纹理的包裹模式设置为重复,这样在0到1范围之外的纹理坐标就会重复显示纹理。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

在你的情况下,纹理坐标会是s = 0-640和t = 0-120。片段着色器不需要什么特别的,只要用普通的 texture2D(tex, texCoord) 就可以了。

撰写回答