【问题标题】:OpenGL Y texture coordinates behaving oddlyOpenGL Y 纹理坐标表现异常
【发布时间】:2012-08-17 02:41:23
【问题描述】:

所以基本上我是在用 opengl/c++ 制作一个 2D 游戏。我有一个带有纹理映射的四边形,因为我不能使用两个图像的非幂(或者至少我不应该)我有一个图像在两个图像的幂内,我希望使用纹理映射删除多余的图像。

GLfloat quadTexcoords[] = {
    0.0, 0.0,
    0.78125, 0.0,
    0.78125, 0.8789,
    0.0, 0.8789
};
glGenBuffers(1, &VBO_texcoords);
glBindBuffer(GL_ARRAY_BUFFER, VBO_texcoords);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadTexcoords), quadTexcoords, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

这是我的纹理代码。我知道没什么特别的。 X 坐标 (0.7256) 工作正常,它会删除图像右侧多余的图像。但是 Y 坐标不起作用。我调试了我的游戏,发现正确的坐标被发送到着色器,但它不会映射。它有时似乎在反向工作,但非常不清楚。

如果我给它一个 Y 坐标,比如 20,它会重复多次,但仍然在四边形的顶部留下一条小白线。我完全不知道它可能是什么。

其他细节:我要映射的图像是 800 x 450,它被包裹在大小为 1024 x 512 的图像中。我按 800 x 450 的纵横比缩放四边形。我怀疑这会有所不同但你永远不知道!

感谢您的宝贵时间。

编辑:这是正在发生的事情的一个例子。

这是完整映射的完整图像(X 和 Y 中的 0 到 1)蓝色部分高 200 像素,完整图像高 300 像素。

第二个图像是映射到 Y 轴三分之二的图像(即 Y 轴的 0 到 0.6666)。这应该删除顶部的白色,但这不是正在发生的事情。我不认为坐标是回到前面的,因为我在网上得到了几个教程的映射。

【问题讨论】:

  • 定义“不起作用”。 究竟发生了什么?纹理的分辨率是多少?
  • 您知道 OpenGL 坐标从 左角开始(不是上角),并且 Y 坐标随着您的上升而增加?所以(0.0,0.0) = 左下,(0.0,1.0) = 左上。我这样说是因为您提到“反向工作”。如果您要翻转纹理的 y 坐标,可能会发生奇怪的事情。
  • 我知道它从左下角开始,我已经说明了这一点。你可以看到上面坐标的顺序。告诉我你的想法
  • "这应该去掉顶部的白色" 应该留下什么颜色?
  • 图片顶部没有白带,所以图片是白蓝白旗

标签: c++ opengl mapping textures


【解决方案1】:

它有时似乎在反向工作,但很不清楚。

OpenGL 假定视口原点位于左下方,纹理坐标与 S 中的平面内存纹素值“一起”运行,然后是 T 方向。从本质上讲,这意味着,对于通常的映射之一,纹理的原点位于 左下,与大多数图像处理程序中的左上原点相反。

因此,在您的情况下,您看到的白色边距只是您可能应用于底部纹理图像的填充,而不是您应该放置它的顶部。为什么你不能使用 NPO2 纹理呢?它们得到了广泛的支持。

【讨论】:

  • 我可以,但我希望这种方式可以工作,因为我可以用它来制作精灵表系统
【解决方案2】:

不是真正解决您的问题,但可能是解决问题的方法:

您可以将图像缩放到 1024x1024(这会使图像变形)并使用 0->1 纹理坐标。因为四边形的纵横比是 800x450,所以图像应该可以正确显示。

【讨论】:

  • 好主意,但我仍然需要解决旧问题,因为我打算使用精灵表
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2015-04-23
  • 2015-02-03
  • 2012-03-06
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多