【问题标题】:OpenGL scaling textureOpenGL缩放纹理
【发布时间】:2012-01-28 18:20:54
【问题描述】:

我正在使用 OpenGL 在我的游戏中绘制纹理。

glClear(GL_COLOR_BUFFER_BIT);

float w = 128;
float h = 128;

w *= scale;
h *= scale;

GLfloat vertices[] = {
    w, 0,
    w, h,
    0, 0,
    0, h
};

float u1 = 0;
float u2 = 1;
float v1 = 0;
float v2 = 1;

GLfloat texCoords[] = {
    u2, v1,
    u2, v2,
    u1, v1,
    u1, v2
};

glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

这是一个简单的例子来解释我的问题。我改变了比例变量,它只影响三角形顶点,不应该改变纹理坐标。当比例为 1 时,我有这张图片:

one http://dl.dropbox.com/u/21467/opengl/1.png

当我将比例更改为 0.99 时,我有这张图片:

two http://dl.dropbox.com/u/21467/opengl/3.png

如果您仔细观察,您会注意到纹理顶部的小条纹。为什么会出现,如何避免?

在我的真实游戏中,我绘制图块,如果我改变比例,我的图块开始出现这些条纹,结果我的游戏中出现了这种讨厌的条纹网格。有谁知道,怎么回事?

【问题讨论】:

  • 谷歌关键词:像素完美渲染

标签: opengl scaling textures


【解决方案1】:

创建纹理缓冲区时调用以下代码:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

如果您仔细观察,您会注意到纹理顶部的小条纹。为什么会出现,如何避免?

发生的情况是,在某些像素处,该屏幕位置的纹理坐标可能类似于-0.00011.0002。 TEXTURE_WRAP_[S/T] 纹理参数详细说明了发生这种情况时会发生什么。

【讨论】:

  • 非常感谢!顺便说一句,我发现常量名称是 GL_TEXTURE_WRAP_T 和 GL_TEXTURE_WRAP_S 并且由于某种原因,我的 OpenGL 中只有 GL_CLAMP。我发现这个问题很有用,它解决了我的问题stackoverflow.com/questions/5617250/…
  • 我刚刚注意到,它仅适用于 GL_NEAREST,并且在 GL_LINEAR 的情况下,我的图像周围仍然有边框......
  • 是的,glTexParameter notes 声明 GL_CLAMP_TO_EDGE 仅在 OpenGL 1.2 或更高版本中可用。请参阅Moving Beyond OpenGL 1.1 for Windows 了解更多信息。
【解决方案2】:

今天第二次...

看到这个答案:

https://stackoverflow.com/a/8643282/524368


哦,男孩,你们从来没有用谷歌搜索过问题吗?这已经成为一些 常见问题解答:

我在这里回答了

https://stackoverflow.com/a/5879551/524368

这里

https://stackoverflow.com/a/7272871/524368

在其他一些地方也是如此。

【讨论】:

  • 我不同意你的观点。我的纹理坐标始终是左下角 (0.0, 0.0) 和右上角 (1.0, 1.0) 并且对应于像素的边缘,因为 0.0 是最小值,而 1.0 是整个纹理的最大值,因此它是边缘。
  • @user1113852:问题是,您不想处理像素边缘,而是处理中心,这样边缘就不会渗入。
  • 如果我理解正确,我必须使我的 S 和 T 坐标不是 (0.0, 0.0) 和 (1.0, 1.0),而是 (0.0 + 1.0/128.0, 0.0 + 1.0/128.0)和 (1.0 - 1.0/128.0, 1.0 - 1.0/128.0)。在这种情况下,白色条纹消失了,但我的纹理模糊了,这意味着它们被缩放了。我不想要那种效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多