使用 OpenGL 在 Assimp 中稳健地加载模型及其材料?
Loading models and their materials in Assimp robustly with OpenGL?
我意识到可以通过多种不同方式加载模型。有些可能没有纹理,只使用顶点颜色,而另一些则有带纹理的材质。现在,我有一个用于绘制带照明的 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
What would be the approach done in a professional setting so that any model can be loaded and drawn into a scene with lighting in the same vain as game engines manage?
或者这个:
defining shaders for different types of lighting techniques and then determining which shader is called for which model
或者这个:
having hard defined attribute pointers in the vertex shader and that if the model doesn't require binding an attribute, it doesn't have to
选一个。在第二种方法中,您不需要标志 - 您可以只绑定虚拟值,例如如果模型没有纹理则为纯白色纹理,如果模型没有顶点颜色则为白色顶点颜色。
我意识到可以通过多种不同方式加载模型。有些可能没有纹理,只使用顶点颜色,而另一些则有带纹理的材质。现在,我有一个用于绘制带照明的 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
What would be the approach done in a professional setting so that any model can be loaded and drawn into a scene with lighting in the same vain as game engines manage?
或者这个:
defining shaders for different types of lighting techniques and then determining which shader is called for which model
或者这个:
having hard defined attribute pointers in the vertex shader and that if the model doesn't require binding an attribute, it doesn't have to
选一个。在第二种方法中,您不需要标志 - 您可以只绑定虚拟值,例如如果模型没有纹理则为纯白色纹理,如果模型没有顶点颜色则为白色顶点颜色。