Material Systems
对于不同的物体或者对象,我们希望其有不同的属性,例如颜色,这些属性是被包含在材质当中的,本节并没有完整的实现材质系统,而是简单的设置了全局变量 u_Color 来修改物体的颜色。
首先创建函数来设置全局变量 Vec4:
void Shader::UpLoadUniformFloat4(const std::string& name, const glm::vec4& values)
{
GLint location = glGetUniformLocation(m_RendererID, name.c_str());
glUniform4f(location, values.x, values.y, values.z, values.w);
}
然后在 SandBox 中定义两个颜色:
glm::vec4 redColor(0.8f, 0.2f, 0.3f, 1.0f);
glm::vec4 blueColor(0.2f, 0.3f, 0.8f, 1.0f);
将这两个颜色分别进行设置,然后在 Shader 中使用这个全局变量:
glm::vec4 redColor(0.8f, 0.2f, 0.3f, 1.0f);
glm::vec4 blueColor(0.2f, 0.3f, 0.8f, 1.0f);
for (int y = 0; y < 20; y++)
{
for (int x = 0; x < 20; x++)
{
glm::vec3 pos(x * 0.11f, y * 0.11f, 0.0f);
glm::mat4 transform = glm::translate(glm::mat4(1.0f), pos) * scale;
if (x % 2 == 0)
m_blueShader->UpLoadUniformFloat4("u_Color", redColor);
else
m_blueShader->UpLoadUniformFloat4("u_Color", blueColor);
//Shader
std::string FlatColor_fragmentSrc = R"(
#version 330 core
layout(location = 0) out vec4 color;
uniform vec4 u_Color;
in vec3 v_Position;
void main()
{
color = u_Color;
}
)";
这里根据列对颜色进行了不同的设置,偶数行被设置成了红色:
由于要先实现 2D 的部分,对材质的要求并不高,所以目前就只通过全局变量的形式设置,在之后的 3D 引擎中可能会进一步的实现 Material System。