Как я могу повторить текстуру 3x9 в GLSL OpenGL?

У меня есть текстура с повторяющимся участком 3x9. Я не хочу хранить мозаичное изображение 1920x1080, которое у меня есть для текстуры, я бы предпочел сгенерировать его в коде, чтобы его можно было правильно применять при других разрешениях. Любые идеи о том, как я могу это сделать? Оригинальная текстура находится здесь: http://img684.imageshack.us/img684/6282/matte1.png

Я знаю, что текстура не является степенью двойки, поэтому мне нужно повторить в шейдере, что я и делаю:

    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()

Любые идеи очень приветствуются.

Спасибо!


person bparker    schedule 02.07.2010    source источник


Ответы (1)


Почти так же, как если бы вы сделали это с фиксированной трубой. Установите режим переноса вашей связанной текстуры на повторение, прежде чем устанавливать униформу сэмплера, а координаты текстуры за пределами диапазона 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).

person Ivan Baldin    schedule 03.07.2010