Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ openGL:从加载的obj文件中丢失详细信息_C++_Opengl - Fatal编程技术网

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

C++ openGL:从加载的obj文件中丢失详细信息,c++,opengl,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;

我正在将一个.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=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就像一个常数,颜色的局部空间变化也是常数,即没有强特征

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

最简单的方法是使用照明。但您也可以使用其他方法,例如,您可以计算法线的局部变化(提供曲面的曲率),并使更强的曲线区域更亮。或者在屏幕空间几何体上执行后处理,应用一阶或二阶梯度过滤器


但你不会抽出时间来应用数学。世上没有免费的一餐。也不要期望人们在不清楚你真正想要什么的情况下为你编写代码。

在你的评论中

我宁愿不使用照明。我不明白为什么没有灯光第一个作品(显示细节),而另一个没有

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

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

|| ∂/∂r n(r) ||
其中n表示法线,r表示位置,对于折痕等,该位置变得非常大

然而,颜色的变化取决于位置
c(r)

|| ∂/∂r c(r) || 
但由于c(r)只依赖于r,没有局部特征,因此c就像一个常数,颜色的局部空间变化也是常数,即没有强特征

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

最简单的方法是使用照明。但您也可以使用其他方法,例如,您可以计算法线的局部变化(提供曲面的曲率),并使更强的曲线区域更亮。或者在屏幕空间几何体上执行后处理,应用一阶或二阶梯度过滤器


但你不会抽出时间来应用数学。世上没有免费的一餐。也不要期望人们在不清楚你真正想要什么的情况下为你编写代码。

在你的评论中

我宁愿不使用照明。我不明白为什么没有灯光第一个作品(显示细节),而另一个没有

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

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

|| ∂/∂r n(r) ||
其中n表示法线,r表示位置,对于折痕等,该位置变得非常大

然而,颜色的变化取决于位置
c(r)

|| ∂/∂r c(r) || 
但由于c(r)只依赖于r,没有局部特征,因此c就像一个常数,颜色的局部空间变化也是常数,即没有强特征

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

最简单的方法是使用照明。但您也可以使用其他方法,例如,您可以计算法线的局部变化(提供曲面的曲率),并使更强的曲线区域更亮。或者在屏幕空间几何体上执行后处理,应用一阶或二阶梯度过滤器


但你不会抽出时间来应用数学。世上没有免费的一餐。也不要期望人们在不清楚你真正想要什么的情况下为你编写代码。

在你的评论中