gpt4 book ai didi

c++ - 纹素中心的采样没有给出正确的结果,OpenGL,C++

转载 作者:可可西里 更新时间:2023-11-01 16:48:03 24 4
gpt4 key购买 nike

不久前,我在显示纹理时遇到了问题,因为我使用纹理元素的边缘而不是纹理元素的中心作为纹理坐标。这与线性混合相结合,给出了平滑的颜色结果,而不是纹理给出的纯色。

感谢这里给我的建议,我认为我的问题已经解决,因为我开始使用纹素中心作为坐标,但它只在一种情况下有效,我不知道为什么只在那种情况下。

我会再次展示一些图片。

这是我使用的纹理(32x32 像素),边框为 2 像素:

enter image description here

我正在绘制的整个对象由 9 个四边形组成,但它们只使用一个纹理(我展示的那个)。其中之一将作为我的问题的解释:

enter image description here

我认为很明显该四边形的颜色未根据纹理正确设置。

它看起来像是混合的问题,但为了设置纹理坐标,我使用了纹理元素的中心,如下所示:

glBegin(GL_QUADS);
// Bottom left
glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset);
glVertex2i(pos.x, pos.y + height - m_borderWidth);

// Top left
glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset);
glVertex2i(pos.x, pos.y + m_borderWidth);

// Top right
glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset);
glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth);

// Bottom right
glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset);
glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth);
glEnd();

为了澄清:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0.0625

texelCentersOffset = 1/64 = 0.015625

有人能告诉我我写的有什么问题吗?

编辑1:

这是我的纹理设置:

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT );
gluBuild2DMipmaps( GL_TEXTURE_2D, 4, m_width, m_height,
GL_RGBA, GL_UNSIGNED_BYTE, pixmap );

当我从 GL_LINEAR 更改为 GL_NEAREST 时,它可以正常工作所以显然是混合问题,但仍然无法弄清楚为什么会出错。

编辑2:

当我将四边形的高度增加到等于或大于纹理的高度时,它可以正常工作而无需更改任何纹理坐标。

最佳答案

在我看来,当您将四边形尺寸设置为小于纹理尺寸时。它必须使用 mipmap 对纹理进行采样。

Mipmaps 是通过平均 4 个纹素 block 制成的。因此,当您对 mipmap 进行采样时,您会从多个纹素中获取信息。因此,通过让您的四边形小于纹理,它必须对 mipmap 进行采样,并且您会得到纹理流血。关闭 mipmapping,我猜它会消失。

关于c++ - 纹素中心的采样没有给出正确的结果,OpenGL,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com