球体在渲染纹理时会显示多边形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了球体在渲染纹理时会显示多边形相关的知识,希望对你有一定的参考价值。

我一直在用XNA / D3D(DX11)渲染台球。我已经编写了一个Blinn-Phone着色器,该着色器在HLSL中使用SamplerState将我的台球纹理映射到我在VisualStudio2012中生成的球形FBX。

我遇到两个问题,两个问题都在下图中最右边的球上最明显。

1)您可以看到纹理揭示了球的基础多边形在哪里。2)在第三行的底部边缘,在条纹下方仅可见一点白色,它看起来非常锯齿或锯齿。

纹理应用程序似乎很大程度上超出了我的控制范围,因为顶点法线之间的插值是在管道中完成的,而不是我自己完成的。

所以,我该如何改善呢?生成具有更多多边形的新球体?

我已经为抗锯齿做了以下工作,但坦率地说,它似乎做得很少:

        graphics.PreferMultiSampling = true;
        graphics.ApplyChanges();
        GraphicsDevice.PresentationParameters.MultiSampleCount = 4;

这是我的纹理贴图状态,它的价值是什么。任何想法将不胜感激。如果您需要更多信息,请告诉我!

sampler2D ColorSampler = sampler_state {
    Texture = <ColorTexture>;
    FILTER = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9UQWpRdi5wbmcifQ==” alt =“台球被渲染”>

答案

为了补充拉胡尔的答案,还有第三个更复杂的选择(尽管我肯定会选择简单地增加多边形的数量):您提到您正在使用着色器-我假设您正在谈论像素着色器。出现此问题是因为纹理坐标在像素着色器的三角形内部线性插值:但是由于您know正在处理球体,因此可以手动计算像素着色器中每个像素的UV坐标(使用标准acos(z)和atan(y / x)公式,其中(x,y,z)点是在对象坐标中栅格化的当前点)。

使用即使使用非常粗糙的镶嵌球体,您仍应能够获得相对平滑的纹理。

EDIT:尽管我手边没有代码段,但这是一个伪代码:

顶点着色器:-获取当前顶点的初始坐标(不进行任何矩阵变换;我假设您的球体顶点以原点为中心),并将其作为varying vec3 P直接传递到像素着色器。

像素着色器:-r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z)-theta = acos(P.z/r)-phi = atan2(P.y/r, P.x/r)-u = theta*2/pi ; v = phi/(2*pi)+0.5-使用上面的(u,v)在tex2D()中对纹理进行采样

您需要确保这些uv坐标确实与纹理的生成方式相对应,但如果是这样,则应该获得几乎无失真的映射。

您有两个选择:

另一答案

您有两个选择:

另一答案

为了解决这个问题,我使用了3DSMax而不是VS2012的内置模型构建器。我将球体的比例设置为2“,并将线段的数量增加到64。导出到FBX时,我启用了“ Turbo Smooth”,但不知道它是什么。

以上是关于球体在渲染纹理时会显示多边形的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL C++ 渲染到纹理

将整数渲染到 GLSL 中的单独纹理

如何使用点图元将纹理映射到由参数方程渲染的球体

从片段着色器中的地形高程数据计算法线

在GLSL ES中的片段着色器上旋转纹理

如何在 PyQt5 QOpenGLWidget 中对球体进行纹理处理