OpenGL:GL_TEXTURE_1D麻烦

时间:2010-07-14 06:08:18

标签: opengl textures

我正在尝试沿任意高度细分对象(STL导入)的Z轴添加一个简单的重复着色渐变(想想叠层)。

它主要起作用,但是我得到了一些非常奇怪的面孔,其中纹理与Z不平行,但旋转和缩放的方式不同。这些面通常(可能总是)垂直定向,有些面很大。我认为垂直面孔最容易应用......所以我现在很难过。

这是init:

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 个答案:

答案 0 :(得分:2)

好的,我已经解决了。 fmod()是一个线索。

而不是:

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

我需要将零件从0到1标准化为Z(或者0到1 * textureScaleFactor ,真的)

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

我将缩放系数应用于范围以获得我想要的纹理密度。

fmod()真的错了。如果一个面具有最小和最大顶点0和1,那么你将得到完整的纹理。但是,如果得到0和1.1,那么它变为0.1,并且它在整个面上缩放十分之一的纹理。哎呀。我很惊讶它在很多其他面孔上都有效。这就是我不休息和睡觉所得到的。 :)

至少在某些时候(删除了 fmod()),我得到了一个别名效果,使得看起来比实际上更糟糕。所以,我也将纹理切换为mipmap。从:

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

要:

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

即使这样,它仍然是远处的混叠。关于如何处理的任何建议?我将使用mipmap级别,看看它在哪里......