Повторяющиеся текстуры в OpenGL - PullRequest
6 голосов
/ 06 октября 2010

Привет, я довольно новичок в OpenGL.

Моя задача - реализовать кисти GDI в OpenGL для рисования в MAC OS X. Поэтому я обратился к текстурам в OpenGL, чтобы сначала нарисовать шаблон, а затем это нужнобыть сопоставленным с примитивами рисования, такими как многоугольник (прямоугольник в данном случае).Я создаю текстуру 8x8 текселей и затем накладываю ее на полигон с координатами ниже в окне 500x500 пикселей.

glVertex3f (0,35, 0,35, 0,0);

glVertex3f (0,35, 0,65, 0,0);

glVertex3f (0,65, 0,65, 0,0);

glVertex3f (0,65, 0,35, 0,0);

Я, поскольку мне нужен эффект кисти, шаблон должен повторяться вдоль прямоугольника.Прямоугольник / квадрат равен 0,3 x 0,3, а все окно имеет размер 500 x 500, тогда с точки зрения пикселей многоугольник равен 150 x 150.

, поэтому необходимы повторения 150/8

. Поэтому я установилтекстурные координаты выглядят следующим образом:

glTexCoord2f(0.0,       0.0);   glVertex3f(0.35, 0.35, 0.0);
glTexCoord2f(0.0,       150/8); glVertex3f(0.35, 0.65, 0.0);
glTexCoord2f(150/8,     150/8); glVertex3f(0.65, 0.65, 0.0);
glTexCoord2f(150/8,     0.0);   glVertex3f(0.65, 0.35, 0.0);

У меня проблема с тем, что созданный мной в качестве текстуры вертикальный штриховочный узор (один тексель прозрачный, а другой цветной) не отображается надлежащим образом в том смысле, что некоторые вертикальныелинии становятся шире, чем другие (своего рода проблема наложения имен).Это как то, что я должен установить координаты текстуры во время отображения?

Спасибо за любые ответы

al

Ответы [ 2 ]

15 голосов
/ 06 октября 2010

Если я вас правильно понимаю, вы неправильно обрабатываете координаты текстуры.При использовании glTexCoord2f() текстура расширяется от 0,0, 0,0 до 1,0, 1,0.Поэтому, если вы хотите иметь текстуру, которая заполняет квад, вы используете следующее:

glTexCoord2f(0.0f, 0.0f);    glVertex3f(0.35f, 0.35f, 0.0f);
glTexCoord2f(0.0f, 1.0f);    glVertex3f(0.35f, 0.65f, 0.0f);
glTexCoord2f(1.0f, 1.0f);    glVertex3f(0.65f, 0.65f, 0.0f);
glTexCoord2f(1.0f, 0.0f);    glVertex3f(0.65f, 0.35f, 0.0f);

И если вы хотите повторить текстуру 8 раз по всей поверхности квадра, используйте 8.0f вместо 1.0фс в вызове texCoords.Вам также необходимо убедиться, что текстура будет повторяться, когда она установлена ​​после того, как вы связали текстуру.

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

Это, вероятно, ваша проблема, но если у вас все еще есть проблемы с наложениемпопробуйте заглянуть в glTexParameteri с GL_TEXTURE_MAG_FILTER и GL_TEXTURE_MAG_FILTER и mip-mapping.

Возможно, ему уже более десяти лет, но этот старый учебник по Flipcode по-прежнему актуален и стоитвзгляд.

РЕДАКТИРОВАТЬ: были вершинные вызовы до вызова texcoord

3 голосов
/ 06 октября 2010

Если код, который вы написали, в точности соответствует вашему коду, то 150/8 - ваша проблема.Это целочисленное деление, которое не возвращает 18,75 с плавающей запятой, а целое число 18.

Измените код на значения с плавающей запятой.

 150.f/8.f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...