0

我的游戏中有一块地板,由 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();
4

3 回答 3

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);
于 2013-02-02T19:33:31.403 回答
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坐标的顺序。

于 2013-02-02T19:39:05.177 回答
-1

我不能只用 1 个四边形来做到这一点,因为它会破坏照明。

这就是每像素照明的全部意义所在。逐顶点光照,您仅在顶点评估光照颜色,并在整个三角形上进行插值,当您的三角形相对于其与灯光的距离相当大时(如在您的落地案例中),结果会很差。如果您使用逐像素光照,您将不得不编写自己的片段着色器,但是您可以只为整个地板使用一个四边形,并且无论光线有多近或多远,光照都是正确的。

另见:http : //www.swiftless.com/tutorials/glsl/5_lighting_perpixel.html,http ://en.wikipedia.org/wiki/Per-pixel_lighting

于 2013-02-02T19:40:43.007 回答