代码之家  ›  专栏  ›  技术社区  ›  darron

OpenGL:GL纹理问题

  •  0
  • darron  · 技术社区  · 14 年前

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

    它基本上是有效的,但我得到了一些非常奇怪的面孔,其中纹理不平行于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 回复  |  直到 14 年前
        1
  •  2
  •   darron    14 年前

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

    而不是:

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

    我需要将Z沿部件从0到1标准化:(或0到1* 纹理比例因子 ,真的)

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

    我将比例因子应用于 范围 为了得到我想要的纹理密度。

    fMODE() 是真的错了。如果一个面有最小和最大顶点点0和1,则得到完整的纹理。但是,如果你得到0和1.1,那么它就变成0.1,并且它在整个面部上缩放纹理的十分之一。哎呀。我很惊讶它对其他许多人的脸起作用。这就是我没有休息和睡觉的原因。:)

    至少在某一点上 fMODE() 删除),我得到了一个别名效果,使更多的似乎是错误的比实际存在。所以,我也把纹理转换成了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级别的游戏,看看这能给我带来什么…