【问题标题】:Vertex displacement breaking mesh顶点位移破坏网格
【发布时间】:2016-04-29 01:09:18
【问题描述】:

我正在为一个项目用 Java (lwjgl) 做一些 OpenGL 的东西,其中一部分包括以 OBJ 格式导入 3d 模型。一切看起来都很好,直到我尝试置换顶点,然后模型分解,你可以看穿它们。 这是来自搅拌机的 Suzanne,UV 映射为完全黑色的纹理(为了可见性)。在片段着色器中,我根据片段法线和世界向上向量之间的片段角度为片段添加一些白色:

到目前为止一切顺利。但是当我对相同的顶点应用一个小的 Y 分量位移时,我希望看到面“伸展”起来。相反会发生这种情况:

顶点着色器:

#version 150

in vec3 position;
in vec2 texCoords;
in vec3 normal;

void main()
{
    vertPosModel = position;                        

    cosTheta = dot(vec3(0.0, 1.0, 0.0), normal);    

    if(cosTheta > 0.0 && cosTheta < 1.0)     
        vertPosModel += vec3(0.0, 0.15, 0.0); 

    gl_Position = transform * vec4(vertPosModel, 1.0);
}

片段着色器:

#version 150

uniform sampler2D objTexture;
in vec2 texcoordOut;
in float cosTheta;
out vec4 fragColor;

void main()
{
    fragColor = vec4(texture(objTexture, texcoordOut.st).rgb, 1.0) + vec4(cosTheta);

}

【问题讨论】:

  • 请在您投反对票之前告诉我如何改进我的问题。不要做懦夫。

标签: opengl glsl lwjgl


【解决方案1】:

因此,您的算法会根据从顶点法线派生的属性偏移顶点的位置。如果您的网格完全光滑,这只会产生一个连接的网格。即两个三角形相交的地方,共享顶点的法线在三角形两边必须相同。

如果模型在曲面上具有不连续的法线,则断点可能会出现在法线不再连续的任何位置。也就是说,正常不连续的边可能会断开。

我很确定 Blender3D 可以生成 Suzanne 的平滑版本。那么...您是否生成了平滑的网格?还是刻面?

【讨论】:

  • 是的,如果您指的是 Blender 中的左侧工具栏,您可以在其中选择“平滑或平坦”阴影。我已经尝试了这两种方法,但如果它只改变法线,我看不出它如何解决问题,因为目前我没有使用法线进行任何照明计算(在我的待办事项列表中)。
  • @peanutops:正如我所说,您正在使用法线进行 position 计算。如果法线没有很好地连接,那么从它们计算的位置也不会连接。
  • 我想我需要重写我的 .obj 导入器,以便共享顶点的面法线合并到共享顶点法线中。我昨天做了类似的事情 - 从搅拌机导出一个 .x3d 代替(法线列表是“每个顶点”而不是每个面导出的),尽管在将它读入 vbo 之后,我的一半脸不见了,叹息。
  • OK 问题已解决。我以 x3d、stl 和 ply 格式重新导出了所有模型,我什至为每个模型编写了基本的导入器,这样我就可以看到数据发生了什么。直到我废弃我的模型并从一开始就在 Blender 中选择平滑阴影制作新模型之前,没有任何效果。我原来的 OBJ 导入器代码工作得很好,正如你所建议的,它是影响法线的着色模型。该死的异常正常:-)非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多