我意识到模型可以通过许多不同的方式加载。有些可能没有纹理,只使用顶点颜色,而另一些则具有带纹理的材质。现在,我有一个着色器用于绘制带照明的 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