我正在尝试沿任意高度细分对象(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);
有没有人看到我如何解决这个问题?
答案 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级别,看看它在哪里......