光照贴图
Posted chen9510
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了光照贴图相关的知识,希望对你有一定的参考价值。
光照贴图一般有漫反射和镜面高光贴图。光照贴图用在片段着色器中,对每个片元计算color时,对于phong光照模型,diffuse和specular材质颜色可以从对应的纹理中采样,这就是光照贴图。
片段着色器代码如下:
#version 430 core out vec4 color; in VS_OUT vec3 FragPos; vec3 Normal; vec2 TexCoords; vs_in; struct Material sampler2D diffuse; sampler2D specular; float shininess; ; struct Light vec3 position; vec3 ambient; vec3 diffuse; vec3 specular; ; uniform Material material; uniform Light light; uniform vec3 viewPos; void main() vec3 ambient=light.ambient * vec3(texture(material.diffuse, vs_in.TexCoords)); vec3 norm=normalize(vs_in.Normal); vec3 lightDir=normalize(light.position-vs_in.FragPos); float diff=max(dot(norm,lightDir),0.0f); vec3 diffuse=light.diffuse * diff * vec3(texture(material.diffuse, vs_in.TexCoords)); vec3 viewDir=normalize(viewPos-vs_in.FragPos); vec3 reflectDir=reflect(-lightDir,norm); float spec=pow(max(dot(viewDir,reflectDir),0.0f),material.shininess); vec3 specular=light.specular * spec * vec3(texture(material.specular, vs_in.TexCoords)); color = vec4(ambient+diffuse+specular, 1.0f);
渲染代码如下(包含设置光照贴图):
void SceneRendering::CubeRendering() //update uniform buffer cube->setViewMat(phc->getViewMatrix()); cube->setProjectionMat(phc->getProjectionMatrix()); shader_cube->use(); shader_cube->setMat4("model", glm::scale(glm::mat4(1),glm::vec3(10))); shader_cube->setInt("material.diffuse", 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, container); shader_cube->setInt("material.specular", 1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, container_specular); shader_cube->setFloat("material.shininess", 500); shader_cube->setVec3("light.ambient", 0.2f, 0.2f, 0.2f); shader_cube->setVec3("light.diffuse", 0.5f, 0.5f, 0.5f); shader_cube->setVec3("light.specular", 1.0f, 1.0f, 1.0f); shader_cube->setVec3("light.position", 0.0f, 0.0f, 50.0f); shader_cube->setVec3("viewPos", phc->getPos()); // draw cubes cube->DrawCube();
效果图:
以上是关于光照贴图的主要内容,如果未能解决你的问题,请参考以下文章