我正在将.obj文件加载到程序中(没有.mtl文件)。
在顶点着色器中,我有以下内容:

#version 330

layout(location = 0) in vec3 in_position;
layout(location = 1) in vec3 in_color;


我的顶点结构如下所示:

struct VertexFormat {
    glm::vec3 position;
    glm::vec3 color;
    glm::vec3 normal;
    glm::vec2 texcoord;
    VertexFormat() { every atribute is glm::vec3(0, 0, 0); }
    VertexFormat(glm::vec3 _position, glm::vec3 _normal, glm::vec2 _texcoord, glm::vec3 _color) {
        position    = _position;
        normal      = _normal;
        texcoord    = _texcoord;
    //  color       = glm::vec3(texcoord, cos(texcoord.x + texcoord.y));
        color       = normal;
    }
}


由于我没有.mtl文件,因此color属性取决于其他顶点属性。

如果我让color = glm::vec3(texcoord, cos(texcoord.x + texcoord.y));,则该对象将丢失一些细节(例如人脸只是一个椭圆体)。

当我使用color = normal;时,不会发生这种情况。

我希望颜色不仅仅依赖于正常属性,因为那样每个对象都被着色为彩虹。

知道为什么以及如何使它起作用吗?

编辑:

这是带有color = normal的对象:



这是color = glm::vec3(texcoord, cos(texcoord.x + texcoord.y));



两张图片之间唯一改变的地方是我注释了color = normal;并对其进行了注释。

最佳答案

在您的评论中,您写道


  我宁愿完全不使用照明。我不明白为什么不先点亮第一幅作品(显示细节),而另一幅却不亮


感知的细节取决于最终图片中的颜色对比度。对比度越强,细节越强(与所谓的空间频率也有很强的关系)。

无论如何,网格中的折痕,边缘,凸起等都会根据表面法线的变化创建一个很强的局部位置,这就是您所看到的。用数学术语,你可以这样写

|| ∂/∂r n(r) ||


其中,n表示法线,r表示位置,对于折痕等来说,它变得非常大。

颜色根据位置c(r)的变化将是

|| ∂/∂r c(r) ||


但是由于c(r)仅取决于r并且没有局部特征c像常数一样起作用,并且颜色的局部空间变化也恒定,即没有强特征。

从本质上讲,这意味着您只能基于曲面特征(例如法线)的导数使细节可见。

最简单的方法是使用照明。但是您也可以使用其他方法,例如,可以计算法线的局部变化(使曲面具有曲率)并使更强的曲线区域变亮。或者,您可以对屏幕空间的几何形状执行后处理,例如应用一阶或二阶渐变滤镜。

但是您不会四处应用数学。没有免费的饭菜。另外,不要指望人们为您编写代码而不明确您的实际需求。

关于c++ - openGL:丢失已加载的obj文件中的详细信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20442401/

10-11 08:03