我意识到可以以许多不同的方式加载模型。一些可能没有纹理,而仅使用顶点颜色,而另一些可能具有纹理的材料。现在,我有一个着色器用于绘制带有光照的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
在专业环境中将采取什么方法,以便可以将任何模型加载并绘制到场景中,而照明却与游戏引擎所管理的徒劳相同?
或者这:
为不同类型的照明技术定义着色器,然后确定为哪个模型调用哪个着色器
或此:
在顶点着色器中具有硬定义的属性指针,并且如果模型不需要绑定属性,则不必这样做
选择一个。在第二种方法中,您不需要标志-您可以绑定虚拟值,例如,如果模型没有纹理,则绑定纯白色纹理;如果模型没有顶点颜色,则绑定白色顶点颜色。