OpenGL光线三 opengl材质Material

一、定义材质Material类
Material::Material(Shader* _shader, glm::vec3 _diffuse, glm::vec3 _specular, glm::vec3 _ambient, float _shininess):
shader(_shader),
diffuse(_diffuse),
specular(_specular),
ambient(_ambient),
shininess(_shininess)
{
}

二、在fragmentShader中定义材质对象
uniform Material material;
三、通过Uniform传递材对象
1、为了便于传值,在Shader类中对uniform进行封装
void Shader::SetUniform3f(const char* paramNameString, glm::vec3 param)
{
glUniform3f(glGetUniformLocation(ID, paramNameString), param.x, param.y, param.z);
}

void Shader::SetUniform1f(const char* paramNameString, float param)
{
glUniform1f(glGetUniformLocation(ID, paramNameString), param);
}
2、在渲染循环中传递material对象
myMaterial->shader->SetUniform3f(“material.ambient”, myMaterial->ambient);
myMaterial->shader->SetUniform3f(“material.diffuse”, myMaterial->diffuse);
myMaterial->shader->SetUniform3f(“material.specular”, myMaterial->specular);
myMaterial->shader->SetUniform1f(“material.shininess”, myMaterial->shininess);

四、在fragmentShader中使用Material
· vec3 lightDir = normalize(lightPos - FragPos);
vec3 reflectVec =reflect(lightDir,Normal);
vec3 cameraVec = normalize(cameraPos - FragPos);
//specular
float specularAmount = pow(max(dot(reflectVec,cameraVec),0.0f),material.shininess);
vec3 specular = material.specularspecularAmountlightColor;

//deffuse
vec3 diffuse =material.diffuse * max(dot(lightDir,Normal),0.0f)*lightColor;
//ambient
vec3 ambient = material.ambient*ambientColor;

FragColor = vec4((ambient+diffuse+specular)*objColor,1.0f);

代码Git地址.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值