opengl - 四 strip 纹理失真

标签 opengl textures texture-mapping

我有一个 GL_QUAD_STRIP 纹理贴图。四边形带自身向后折叠以形成 UV 球体。从本质上讲,四边形通常不是由矩形构成的,而是由梯形构成的。

我遇到了纹理失真问题。纹理坐标是正确的(例如,它们在应有的位置排列得很好)。问题在于梯形面本身。

我希望朝向梯形面较大端的纹素对向较大的区域,但该面似乎分成两个三角形。它看起来类似于仿射纹理映射(但我不认为它是;它看起来仍然是正确的透视图,我不希望它被使用)。

我知道显卡通常会在内部将四边形缩小为三角形,但我不认为这会影响纹理。 . .

所以,我不知道这里发生了什么。有什么想法吗?

这是一个不良行为的例子。低分辨率地球纹理,最近的过滤,无 mipmaps 或各向异性: enter image description here

最佳答案

这是对简单四边形进行纹理处理时的经典问题。这是因为(就像你猜对的那样)四边形被分解成单独的三角形。这些三角形依次独立纹理化。

问题是,三角形内的纹理坐标是从顶点线性插值的(虽然透视正确,但这在这里无济于事)。你可以把它想象成光栅化器不知道这个梯形的第四个顶点,它只能看到单个三角形。因此它假设三角形到纹理空间的变换是完全仿射的,因此三角形是平行四边形的一部分。

要解决这个问题,您需要做的是从简单的 2D 仿射纹理空间转移到投影纹理空间,方法是使用完整的 4 维纹理坐标而不是简单的 2D 纹理坐标,如解释的那样 here .您基本上做的是 GL 已经使用透视校正插值所做的事情,但是使用您自己的纹理坐标透视投影(除了已经为顶点位置完成的透视投影之外)。

关于opengl - 四 strip 纹理失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832909/

相关文章:

c++ - GlPolygonStipple 的掩码参数如何工作?

c++ - OpenGL:渲染天空盒 cubmap 问题

java - opengl3中的立方体纹理

javascript - Canvas 快速纹理映射

c++ - 如何将点光源转换为卵形/椭圆形?

java - Jogl 动画师总是说 FPS 为 0

c++ - 为什么该代码不绘制 Sprite C++ SFML

matlab - 如何在matlab中将纹理映射到旋转表面?

python - 为什么我的纹理不显示 PyOpenGL

c# - 动态改变 Texture2D