【问题标题】:Computing texture coordinates for a single tile with a texture atlas in OpenGL在 OpenGL 中使用纹理图集计算单个图块的纹理坐标
【发布时间】:2010-12-11 05:04:21
【问题描述】:

我正在尝试在使用 OpenTK 库的 C#/OpenGl 编写的游戏程序中使用纹理图集。

我在 OpenGL 中将纹理图集加载为纹理(尺寸为 256x256),每个图块为 32x32。

为了显示地图集的第一个图块,我使用了以下代码:

GL.Begin(BeginMode.Quads);
GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0.125f, 0); GL.Vertex2((32 * zoom), 0);
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom));
GL.TexCoord2(0, 0.125f); GL.Vertex2(0, (32 * zoom));
GL.End();

0.125 是通过除以 1/8 计算得出的,8 是行/列中的瓦片数。

我不知道如何以这种方式计算第二个图块的坐标! 我尝试分别使用 0.125 和 0.25 代替 0 和 0.125,但这没有任何效果。我猜您不允许对(EDIT)前(0)个纹理坐标使用大于零的值?

如果有人可以提供帮助或提供更好的方法,将不胜感激!

【问题讨论】:

标签: c# opengl textures


【解决方案1】:

试一试:

int col = 0;
int row = 0;
float tex_w = 256;
float tex_h = 256;
float tile_w = 32;
float tile_h = 32;
float w_factor = tile_w / tex_w;
float h_factor = tile_h / tex_h;

float x_tex_beg = w_factor*(col+0);
float x_tex_end = w_factor*(col+1);
float y_tex_beg = h_factor*(row+0);
float y_tex_end = h_factor*(row+1);

【讨论】:

  • 非常感谢!这将对我的坐标生成例程有很大帮​​助:)
【解决方案2】:
  1. 摆脱“* 缩放”。只需在 gl.begin 之前调用 gl.scale(zoom,zoom,1)。
  2. 查看嵌套循环中的 8x8 块,如下所示:

    GL.Scale(zoom*32,zoom*32,1);
    GL.Begin(BeginMode.Quads);
    for (int i=0; i<8; i++)
    for (int j=0; j<8; j++)
    {
    var x = i/8.0; // texture scale
    var y = j/8.0;
    GL.TexCoord2(x, y); GL.Vertex2(i, j);
    GL.TexCoord2(x+0.125f, y); GL.Vertex2(i+1, j);
    GL.TexCoord2(x+0.125f, y+0.125f); GL.Vertex2(i+1, j+1);
    GL.TexCoord2(x, y+0.125f); GL.Vertex2(i, j+1);
    }
    GL.End();
    GL.Scale(1.0/(zoom*32),1.0/(zoom*32),1); // unzoom

【讨论】:

  • 对于#1,我猜这会提高性能吗?谢谢你的提示。我对这个数学感到相当困惑,我只是在相当长的中断后重新开始编程。非常感谢:)
  • 对不起,双重注释,但只是一个问题:我注意到当我使用这段代码时,纹理图集的底部出现了一条灰色的直线。只有 4 个纹理,其余的都是透明的(32 位 png)。这有什么原因吗?谢谢
  • 嗯...我不确定我是否理解问题所在。也许张贴一张图片(试试 imgur.com)。
  • imgur.com/Y1JEQ.png 当zoom = 1 时灰线不可见,并且图块显示为32px,但如果缩放增加,则该线变得可见。我检查了它是否是 Photoshop 中的图集,但不是。
  • 嗯...也许你的卡的纹理采样出了点问题。尝试将 .001f 添加到每个 texcoord:texcoord2(x+.001f,y+.001f)
【解决方案3】:

纹理坐标介于 0 和 1 之间。将其想象为瓦片网格的平移,但它们不是 32x32,而是 0.125fx0.125f。 此外,256/8 = 32。您通过执行 32/256 得到数字。

要获得第二个图块(假设您要水平穿过),您需要移动(即添加 0.125f)到纹理坐标 x 值。示例:

GL.TexCoord2(0.125f, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0.25f, 0); GL.Vertex2((32 * zoom), 0);
GL.TexCoord2(0.25f, 0.125f); GL.Vertex2((32 * zoom), (32 * zoom));
GL.TexCoord2(0.125f, 0.125f); GL.Vertex2(0, (32 * zoom));

【讨论】:

  • 啊,我通过 1/8 得到了数字,但同样的事情! :) 啊哈!这里的 0 很容易混淆,我完全忽略了 x 和 y 之间的区别,只查看它们的值。非常感谢,我试试看
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2014-12-30
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多