โ Material
์ค์ ์ธ๊ณ์์ ์ฌ๋ฌผ๋ค์ ๋น์ ๊ฐ์ ๋ค๋ฅด๊ฒ ๋ฐ์ํ๋ค. OpenGL์์ ๊ฐ ์ ํ์ ์ค๋ธ์ ํธ๋ค์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด ์ค๋ธ์ ํธ์ 3๊ฐ์ง์ Lighting ์์(Ambient, Diffuse, Specular)์ Shininess ์์๋ฅผ ์ถ๊ฐํ์ฌ Material ์์ฑ์ ์ ์ํ๋ค.
// Fragment Shader
#version 330 core
struct Material
{
vec3 ambient; // ์ฃผ๋ณ๊ด์ ๋ํ ์ปฌ๋ฌ๋ฅผ ์ ์
vec3 diffuse; // ๋ถ์ฐ๊ด์ ๋ํ ์ปฌ๋ฌ๋ฅผ ์ ์
vec3 specular; // ๋ฐ์ฌ๊ด์ ๋ํ ์ปฌ๋ฌ๋ฅผ ์ ์
float shininess; // Specualr ํ์ด๋ผ์ดํธ ํผ์ง์ ์ ๋
};
uniform Material material;
http://devernay.free.fr/cours/opengl/materials.html์ ํ ์ด๋ธ์ ๊ฐ์ผ๋ก ์ค์ Material์ ์๋ฎฌ๋ ์ด์ ํด ๋ณผ์ ์๋ค.
lightColor(๊ด์) ๋ํ ์์๋ค์ ๋๋์ด ๊ฐ๊ฐ ๋ค๋ฅธ ์ธ๊ธฐ๋ฅผ ์ค์ ํด์ค๋ค.
struct Light
{
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light light;
โ Material ์ธํ
material uniform์ผ๋ก ๋ณ์์ ์ ๊ทผํ์ฌ lighting ๊ณ์ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
// Fragment Shader
void main()
{
// ambient
vec3 ambient = light.ambient * material.ambient;
// diffuse
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = light.diffuse * (diff * material.diffuse);
// specular
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
vec3 specular = light.specular * (spec * material.specular);
vec3 result = ambient + diffuse + specular;
FragColor = vec4(result, 1.0);
}
struct๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด์๋ ๊ฐ uniform ๋ณ์๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
// material
glUniform3f(glGetUniformLocation(lightingShader.ID, "material.ambient"), 1.0f, 0.5f, 0.31f);
glUniform3f(glGetUniformLocation(lightingShader.ID, "material.diffuse"), 1.0f, 0.5f, 0.31f);
glUniform3f(glGetUniformLocation(lightingShader.ID, "material.specular"), 0.5f, 0.5f, 0.5f);
glUniform1f(glGetUniformLocation(lightingShader.ID, "material.shininess"), 32.0f);
// light
glUniform3f(glGetUniformLocation(lightingShader.ID, "light.ambient"), 0.2f, 0.2f, 0.2f);
glUniform3f(glGetUniformLocation(lightingShader.ID, "light.diffuse"), 0.5f, 0.5f, 0.5f);
glUniform3f(glGetUniformLocation(lightingShader.ID, "light.specular"), 1.0f, 1.0f, 1.0f);
* ์ค๋ธ์ ํธ์ ์๋ ์์์ material.diffuse ๊ฐ์ด ์๋ฏธํ๋ค.
๋น์ ์์์ ์ค๋ธ์ ํธ์ ์ถ๋ ฅ ์์์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค. ๋น์ ์์์ ๋ฐ๋ฅธ ์ค๋ธ์ ํธ ์ถ๋ ฅ ์์์ ๋ณํ๋ฅผ ๋ณด๊ธฐ ์ํด ambient์ diffuse ์์์ ๋ฐ๊ฟ ๋น์ ์์์ ์์ ํ ์ ์๋ค.
// render loop
glm::vec3 lightColor;
lightColor.x = sin(glfwGetTime() * 2.0f);
lightColor.y = sin(glfwGetTime() * 0.7f);
lightColor.z = sin(glfwGetTime() * 1.3f);
glm::vec3 diffuseColor = lightColor * glm::vec3(0.5f);
glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f);
lightingShader.setVec3("light.ambient", ambientColor);
lightingShader.setVec3("light.diffuse", diffuseColor);'๐จ Graphics > ๐ต OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OpenGL] Lighting Caster (0) | 2024.08.15 |
|---|---|
| [OpenGL] Lighting Maps (0) | 2024.08.15 |
| [OpenGL] Phong ์กฐ๋ช ๋ชจ๋ธ (0) | 2024.08.12 |
| [OpenGL] ์นด๋ฉ๋ผ ์ค์ ๋ฐ ๋ณํ (์ด๋, ํ์ ) (0) | 2024.08.08 |
| [OpenGL] ์์ผ๊ฐ(FOV), ํ๋ฉด๋น(Aspect Ratio) (0) | 2024.08.08 |