【问题标题】:Loading models and their materials in Assimp robustly with OpenGL?使用 OpenGL 在 Assimp 中稳健地加载模型及其材质?
【发布时间】:2020-01-13 17:33:01
【问题描述】:

我意识到可以通过多种不同方式加载模型。有些可能没有纹理,只使用顶点颜色,而另一些则具有带纹理的材质。现在,我有一个着色器用于绘制带照明的 3d 模型,但我将如何加载需要以不同方式渲染的模型并让它们在场景中正确渲染。

我想到的一种方法是在顶点着色器中使用硬定义的属性指针,如果模型不需要绑定属性,则不必这样做。我想如果一个属性没有绑定到并且在计算中使用,它不会贡献或抵消任何值(特别是如果你单独进行计算并最终将它们相加(例如,计算该片段的顶点颜色的像素并将其相加以获得纹理像素的颜色)

您可以想象顶点着色器的样子:

#version 330 core
layout (location = 0) in vec3 aPos; // Vertex positions
layout (location = 1) in vec3 aNormal; // Normals
layout (location = 2) in vec2 aTexCoords; // Optional Texture coordinates 
layout (location = 3) in vec3 aColors; // Optional vertex colours

out vec3 FragPos;
out vec3 Normal;
out vec2 TexCoords;
out vec3 Colors;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    FragPos = vec3(model * vec4(aPos, 1.0));
    Normal = mat3(transpose(inverse(model))) * aNormal;  
    TexCoords = aTexCoords;
    Colors = aColors;

    gl_Position = projection * view * vec4(FragPos, 1.0);
}

我可以看到的一个问题是我不确定如何判断是使用 texCoords 还是颜色或两者兼而有之。也许使用制服作为标志并将该数据保存在模型对象中?

另一种方法是为不同类型的照明技术定义着色器,然后确定为哪个模型调用哪个着色器。这是我最不喜欢的,因为它不允许使用动态方法(即同时使用顶点颜色和纹理)

在专业环境中采用什么方法可以加载任何模型并将其绘制到具有照明的场景中,就像游戏引擎管理的那样徒劳无功? (现在使用前向渲染,所以不需要任何延迟着色概念,因为目前这超出了我的工资等级)。我不是在寻求具体的解决方案,更多的是关于如何解决这个问题的专家知识。

另外,我使用的是 OpenGL 3.3

【问题讨论】:

  • 这并不能回答您的 opengl 问题,但是您想做的事情越明确,我越建议至少找出“Vulkan”的作用。它旨在允许更明确地做事并最终更快地做事 - 但不是让事情变得更容易......
  • “在专业环境中采用什么方法可以加载任何模型并将其绘制到具有照明的场景中,就像游戏引擎管理的那样徒劳无功?”游戏引擎不这样做 - 没有人可以。游戏引擎与其各自的资产管道密切相关,您不能只导入 any 模型,尤其是 any 材质。材质参数仅对特定的光照模型有意义,如果不了解该信息(通常不存储在文件中),就不可能“正确”渲染它。
  • @derhass 您能否具体说明资产管道的含义?因为这在不同的上下文中可能意味着不同的事情。此外,更重要的是我可以导入一个使用顶点颜色的模型和一个使用漫反射、环境、镜面反射贴图的模型,我猜 Unity 或 Unreal 可以接受这一点。我想知道他们是如何发现这一点并将正确的数据发送到他们的着色器
  • 好吧,我所说的“资产管道”是指所有工具和实际的工作流程,各种艺术家使用它们来创建与这些引擎一起使用的内容/资产。 “使用漫反射贴图、环境贴图、镜面反射贴图的模型”假设光照模型具有这三个组件——不再使用这些组件。趋势是基于物理的着色(也可以增加不同引擎/资产管道之间的可互换性),其中通常有一些反照率、粗糙度和“金属度”参数。但实际模型以及参数的含义各不相同。
  • 最后,归结为这样:存储在这些模型文件中的数据只是某些公式中的参数 / 输入。有了可编程着色,这个公式不再被嵌入到你的 GPU 中(我们在 20 年前就有了),也没有写在一些明确的规范中,但是每个人都可以 - 并且将会 - 编写自己的公式。在不知道公式的情况下,参数本身没有任何意义

标签: c++ opengl assimp 3d-rendering


【解决方案1】:

在专业环境中采用什么方法可以加载任何模型并将其绘制到具有照明的场景中,就像游戏引擎管理的那样徒劳无功?

要么:

为不同类型的照明技术定义着色器,然后确定为哪个模型调用哪个着色器

或者这个:

在顶点着色器中具有硬定义的属性指针,并且如果模型不需要绑定属性,则不必

选择一个。在第二种方法中,您不需要标志 - 您可以只绑定虚拟值,例如,如果模型没有纹理,则为纯白色纹理,如果模型没有顶点颜色,则为白色顶点颜色。

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2018-05-11
    • 2015-07-26
    • 2016-12-28
    • 2018-09-12
    相关资源
    最近更新 更多