openGL:从加载的obj文件中丢失详细信息

时间:2013-12-07 14:20:35

标签: c++ opengl

我正在将.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的对象:

enter image description here

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

enter image description here

这两张照片之间唯一的变化是我评论了color = normal;并对另一张进行了评论。

1 个答案:

答案 0 :(得分:3)

在你的评论中你写了

  

我宁愿根本不使用照明。我不明白为什么没有点亮第一部作品(显示细节),而另一部分没有

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

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

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

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

然而,颜色依赖位置c(r)的变化将是

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

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

基本上,这意味着您只能根据表面特征的衍生物(例如法线)来显示细节。

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

但你不会绕过它来应用数学。没有免费餐这样的东西。也不要指望人们为你编写代码而不清楚你真正想要的是什么。