OpenGL: GL_TEXTURE_1D проблема - PullRequest
0 голосов
/ 14 июля 2010

Я пытаюсь добавить простой повторяющийся затененный градиент (например, слоистые слои) вдоль оси Z произвольных объектов с высокой тесселяцией (импорт STL).

В основном это работает, но я получаю некоторые действительно странные лица, где текстура не параллельна Z, но вращается и масштабируется по-разному. Эти лица обычно (возможно, всегда) ориентированы вертикально, а некоторые довольно большие. Я бы подумал, что вертикальные грани будет проще всего применить ... поэтому я в настоящее время в тупике.

Вот инициат:

glBindTexture(GL_TEXTURE_1D, _d->textures[0]);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //GL_DECAL);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0,
  GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits());

И используется:

glEnable(GL_TEXTURE_1D);
foreach(const STLTriangle& t, _model.triangles())
{
  glBegin(GL_TRIANGLES);
  glNormal3f(t.normal[0], t.normal[1], t.normal[2]);
  glTexCoord1f(fmod(t.v[0][2],1.0)); glVertex3f(t.v[0][0],t.v[0][1],t.v[0][2]);
  glTexCoord1f(fmod(t.v[1][2],1.0)); glVertex3f(t.v[1][0],t.v[1][1],t.v[1][2]);
  glTexCoord1f(fmod(t.v[2][2],1.0)); glVertex3f(t.v[2][0],t.v[2][1],t.v[2][2]);
  glEnd();
}
glDisable(GL_TEXTURE_1D);

Кто-нибудь видит что-то не так в том, как я поступаю?

1 Ответ

2 голосов
/ 14 июля 2010

Хорошо, я решил это.Fmod () была подсказкой.

Вместо:

glTexCoord1f(t.v[0][2]);

Мне нужно было нормализовать Z вдоль части от 0 до 1: (или от 0 до 1 * textureScaleFactor , действительно)

glTexCoord1f((t.v[0][2] - bounds.min[2]) / range);

Я применяю коэффициент масштабирования к диапазон , чтобы получить желаемую плотность текстуры.

fmod () был действительно неправ.Если у грани есть минимальная и максимальная точки вершин 0 и 1, то вы получите полную текстуру.Однако, если вы получаете 0 и 1,1, то это становится 0,1, и это масштабирует десятую часть текстуры по лицу.К сожалению.Я поражен, что это сработало на многих других лицах.Вот что я получаю за то, что не делаю перерыв и немного сплю.:)

По крайней мере, в какой-то момент (с удалением fmod () ) я получал эффект сглаживания, из-за которого казалось, что больше ошибочных, чем было на самом деле.Итак, я также переключил текстуру в MipMap.From:

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, _d->sideImage.width(), 0,
  GL_BGRA_EXT, GL_UNSIGNED_BYTE, _d->sideImage.bits());

To:

gluBuild1DMipmaps(GL_TEXTURE_1D, GL_RGB, _d->sideImage.width(), GL_BGRA_EXT,
  GL_UNSIGNED_BYTE, _d->sideImage.bits());

Даже при этом, это все еще наложение псевдонимов на расстоянии.Любые предложения о том, как справиться с этим?Я поиграю с уровнями mipmap и посмотрю, куда это меня приведет ...

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