OpenGL - 如何在此处映射纹理?

时间:2013-02-02 19:23:50

标签: opengl textures

我的游戏中有一个地板,由100x100四边形组成。我不能只用1个四边形,因为它会破坏照明。这就是问题 - 如何在所有这些上添加单个纹理? 此代码将纹理放在每个四边形上,但这不是我想要的效果。

glBegin(GL_QUADS);
glNormal3f(0,0,1);

for(float j = 0; j < 1; j+=0.01)
{       
      for(float i = 0; i < 1; i+=0.01)
    {           
        glTexCoord2f(0.0,0.0); glVertex2f(i,j+0.01);
        glTexCoord2f(1.0,0.0); glVertex2f(i,j);
        glTexCoord2f(1.0,1.0); glVertex2f(i+0.01,j);
        glTexCoord2f(0.0,1.0); glVertex2f(i+0.01,j+0.01);
    }

}
glEnd();
glPopMatrix();

3 个答案:

答案 0 :(得分:0)

快速而肮脏的解决方案可以是使用与地板相同的纹理坐标值:

glTexCoord2f(i, j+0.01);      glVertex2f(i, j+0.01);
glTexCoord2f(i, j);           glVertex2f(i, j);
glTexCoord2f(i+0.01, j);      glVertex2f(i+0.01, j);
glTexCoord2f(i+0.01, j+0.01); glVertex2f(i+0.01, j+0.01);

答案 1 :(得分:0)

好吧,看起来您使用的是较旧版本的OpenGL,因此您可能无法使用它们,但使用自定义片段着色器可以解决您的问题。这就是我要做的。 但我认为你要找的是你只需要插入UV坐标。 例如,如果您有4个方格,而不是

0.0f,0.0f
1.0f,0.0f
1.0f,1.0f
0.0f,1.0f

第一个应该是

0.0f,0.0f
.5f,0.0f
.5f,.5f
.0f,.5f

我也会在你的for循环中使用整数来获得更可预测的行为,但是你所拥有的东西可以调整你计算顶点位置到索引的方式。

    glTexCoord2f(i,j); glVertex2f(i,j+0.01);
    glTexCoord2f(i+.01,j); glVertex2f(i,j);
    glTexCoord2f(i+.01,j+.01); glVertex2f(i+0.01,j);
    glTexCoord2f(i,j+.01); glVertex2f(i+0.01,j+0.01);

请注意tex coords的顺序。

答案 2 :(得分:-1)

  

我不能只使用1个四边形,因为它会破坏照明。

这是每像素照明的全部内容。每顶点光照,您只在顶点处评估光照颜色,并在整个三角形中进行插值,当您的三角形相对于它与光线的距离相当大时,会产生较差的结果,就像您的地板情况一样。如果你使用每像素照明,你必须编写自己的片段着色器,但是你可以只使用一个四边形用于整个楼层,无论光线有多近或远,光线都是正确的。

另请参阅:http://www.swiftless.com/tutorials/glsl/5_lighting_perpixel.htmlhttp://en.wikipedia.org/wiki/Per-pixel_lighting