Uniforms
μ λνΌμ CPUμ μλ μ°λ¦¬μ μ ν리μΌμ΄μ μμ GPUμ μμ΄λλ‘ λ°μ΄ν°λ₯Ό μ λ¬νλ λ λ€λ₯Έ λ°©λ²μ λλ€.
νμ§λ§ μ λνΌμ μ μ μμ±κ³Όλ μ½κ° λ€λ¦ λλ€. λ¨Όμ , μ λνΌμ μ μμ μ λλ€. μ μμ μ΄λΌλ κ²μ μ λνΌ λ³μκ° μμ΄λ νλ‘κ·Έλ¨ κ°μ²΄λ§λ€ κ³ μ νλ©°, μμ΄λ νλ‘κ·Έλ¨μ μ΄λ€ λ¨κ³μμλ μ΄λ€ μμ΄λμμλ μ κ·Όν μ μλ€λ λ»μ λλ€.
λμ§Έ, μ΄λ€ κ°μ μ λνΌ κ°μΌλ‘ μ€μ νλ , μ λνΌμ 리μ λκ±°λ μ λ°μ΄νΈλ λκΉμ§ κ·Έ κ°μ μ μ§ν©λλ€.
GLSLμμ μ λνΌμ μ μΈνλ €λ©΄ νμ κ³Ό μ΄λ¦μ΄ μλ μμ΄λμ μ λνΌ ν€μλλ₯Ό κ°λ¨ν μΆκ°ν©λλ€.
κ·Έ νλ‘λ μμ΄λμμ μλ‘ μ μΈλ μ λνΌμ μ¬μ©ν μ μμ΅λλ€. μ΄λ²μλ μΌκ°νμ μμμ μ λνΌμ ν΅ν΄ μ€μ ν΄ λ³΄κ² μ΅λλ€.
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor; // μ°λ¦¬λ μ΄ λ³μλ₯Ό OpenGL μ½λμμ μ€μ ν©λλ€.
void main()
{
FragColor = ourColor;
}
μ°λ¦¬λ fragment μμ΄λμ vec4 μ λνΌ ourColorλ₯Ό μ μΈνκ³ μ‘°κ°μ μΆλ ₯ μμμ μ΄ μ λνΌ κ°μ λ΄μ©μΌλ‘ μ€μ νμ΅λλ€.
μ λνΌμ μ μ λ³μμ΄λ―λ‘, μ°λ¦¬κ° μνλ μμ΄λ λ¨κ³ μ΄λμμλ μ μν μ μμΌλ―λ‘ μ μ μμ΄λλ₯Ό λ€μ κ±°μ³ fragment μμ΄λλ‘ λ¬΄μΈκ°λ₯Ό κ°μ Έκ° νμκ° μμ΅λλ€.
μ°λ¦¬λ μ΄ μ λνΌμ μ μ μμ΄λμμ μ¬μ©νμ§ μμΌλ―λ‘ κ·Έκ³³μμ μ μν νμκ° μμ΅λλ€.
GLSL μ½λμμ μ΄λμλ μ¬μ©λμ§ μλ μ λνΌμ μ μΈνλ©΄ μ»΄νμΌλ¬λ μ»΄νμΌλ λ²μ μμ λ³μλ₯Ό μ‘°μ©ν μ κ±°νλλ°, μ΄κ²μ΄ μ¬λ¬ λ΅λ΅ν μ€λ₯μ μμΈμ΄ λ©λλ€; μ΄ μ μ λͺ μ¬νμΈμ!
νμ¬ μ λνΌμ λΉμ΄ μμ΅λλ€; μμ§ μ λνΌμ μ΄λ€ λ°μ΄ν°λ μΆκ°νμ§ μμμΌλ―λ‘ μ΄μ κ·Έκ²μ μλν΄λ³΄κ² μ΅λλ€.
λ¨Όμ μ°λ¦¬μ μμ΄λμμ μ λνΌ μμ±μ μΈλ±μ€/μμΉλ₯Ό μ°ΎμμΌ ν©λλ€.
μ λνΌμ μΈλ±μ€/μμΉλ₯Ό μκ² λλ©΄, κ·Έ κ°λ€μ μ λ°μ΄νΈν μ μμ΅λλ€.
μ‘°κ° μμ΄λμ λ¨μΌ μμμ μ λ¬νλ λμ , μκ°μ΄ μ§λ¨μ λ°λΌ μ μ°¨ μμμ΄ λ³νλλ‘ μΌμ λ ν₯λ―Έλ‘κ² λ§λ€μ΄λ³΄κ² μ΅λλ€.
float timeValue = glfwGetTime();
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
λ¨Όμ glfwGetTime()μ ν΅ν΄ μ€ν μ€μΈ μκ°μ μ΄ λ¨μλ‘ κ²μν©λλ€.
κ·Έλ° λ€μ sin ν¨μλ₯Ό μ¬μ©νμ¬ 0.0 - 1.0 λ²μμμ μμμ λ³νμν€κ³ κ·Έ κ²°κ³Όλ₯Ό greenValueμ μ μ₯ν©λλ€.
κ·Έλ° λ€μ glGetUniformLocationμ μ¬μ©νμ¬ ourColor μ λνΌμ μμΉλ₯Ό μ‘°νν©λλ€.
쿼리 ν¨μμ μμ΄λ νλ‘κ·Έλ¨κ³Ό μ λνΌμ μ΄λ¦(μμΉλ₯Ό κ²μνλ €λ)μ μ 곡ν©λλ€.
glGetUniformLocationμ΄ -1μ λ°ννλ©΄ μμΉλ₯Ό μ°Ύμ μ μλ κ²μ λλ€.
λ§μ§λ§μΌλ‘ glUniform4f ν¨μλ₯Ό μ¬μ©νμ¬ μ λνΌ κ°μ μ€μ ν μ μμ΅λλ€.
μ λνΌ μμΉλ₯Ό μ°Ύλ λ° μμ΄λ νλ‘κ·Έλ¨μ λ¨Όμ μ¬μ©ν νμλ μμ§λ§,
μ λνΌμ μ λ°μ΄νΈνλ €λ©΄ λ¨Όμ νλ‘κ·Έλ¨μ μ¬μ©ν΄μΌ ν©λλ€(glUseProgramμ νΈμΆν¨μΌλ‘μ¨),
μλνλ©΄ μ΄κ²μ νμ¬ νμ±νλ μμ΄λ νλ‘κ·Έλ¨μ μ λνΌμ μ€μ νκΈ° λλ¬Έμ λλ€.
OpenGLμ ν΅μ¬μ μΌλ‘ C λΌμ΄λΈλ¬λ¦¬μ΄κΈ° λλ¬Έμ ν¨μ μ€λ²λ‘λ©μ λν κΈ°λ³Έ μ§μμ΄ μμΌλ©°, λ€λ₯Έ νμ μΌλ‘ νΈμΆλ μ μλ ν¨μλ OpenGLμ΄ νμν κ° νμ μ λν μλ‘μ΄ ν¨μλ₯Ό μ μν©λλ€.
glUniformμ μ΄λ¬ν μλ²½ν μμ λλ€. μ΄ ν¨μλ μ€μ νλ €λ μ λνΌμ νμ μ λ°λΌ νΉμ μ λ―Έμ¬λ₯Ό μꡬν©λλ€.
κ°λ₯ν λͺ κ°μ§ μ λ―Έμ¬λ λ€μκ³Ό κ°μ΅λλ€.
- f: ν¨μλ float κ°μ μμν©λλ€.
- i: ν¨μλ int κ°μ μμν©λλ€.
- ui: ν¨μλ unsigned int κ°μ μμν©λλ€.
- 3f: ν¨μλ 3κ°μ float κ°μ μμν©λλ€.
- fv: ν¨μλ float 벑ν°/λ°°μ΄ κ°μ μμν©λλ€.
OpenGLμ μ΅μ μ ꡬμ±νλ €λ©΄ ν΄λΉ νμ μ ν΄λΉνλ μ€λ²λ‘λλ ν¨μλ₯Ό μ ννκΈ°λ§ νλ©΄ λ©λλ€.
μ°λ¦¬μ κ²½μ°μλ μ λνΌμ 4κ° floatμ κ°λ³μ μΌλ‘ μ€μ νλ €κ³ νλ―λ‘ glUniform4fλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ λ¬ν©λλ€(fv λ²μ μ μ¬μ©ν μλ μμ΅λλ€).
μ΄μ μ λνΌ λ³μμ κ°μ μ€μ νλ λ°©λ²μ μμμΌλ―λ‘, λ λλ§μ κ·Έκ²μ μ¬μ©ν μ μμ΅λλ€.
μμμ΄ μ μ§μ μΌλ‘ λ³νκΈ°λ₯Ό μνλ€λ©΄, μ°λ¦¬λ λ§€ νλ μλ§λ€ μ΄ μ λνΌμ μ λ°μ΄νΈνλ €κ³ ν©λλ€.
κ·Έλ μ§ μμΌλ©΄ ν λ²λ§ μ€μ νλ©΄ μΌκ°νμ΄ λ¨μΌ κ³ μ²΄ μμ μ μ§νκ² λ©λλ€. κ·Έλμ μ°λ¦¬λ greenValueλ₯Ό κ³μ°νκ³ κ° λ λλ§ λ°λ³΅μμ μ λνΌμ μ λ°μ΄νΈν©λλ€.
while(!glfwWindowShouldClose(window))
{
// input
processInput(window);
// render
// clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// be sure to activate the shader
glUseProgram(shaderProgram);
// update the uniform color
float timeValue = glfwGetTime();
float greenValue = sin(timeValue) / 2.0f + 0.5f;
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
// now render the triangle
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
// swap buffers and poll IO events
glfwSwapBuffers(window);
glfwPollEvents();
}

보μλ€μνΌ, μ λνΌμ λ§€ νλ μλ§λ€ λ³κ²½λ μ μλ μμ±μ μ€μ νκ±°λ μ ν리μΌμ΄μ κ³Ό μμ΄λ μ¬μ΄μμ λ°μ΄ν°λ₯Ό κ΅ννλ λ° μ μ©ν λꡬμ λλ€.
νμ§λ§ κ° μ μ λ§λ€ μμμ μ€μ νκ³ μΆλ€λ©΄ μ΄λ¨κΉμ? κ·Έ κ²½μ°μλ μ μ μλ§νΌ λ§μ μ λνΌμ μ μΈν΄μΌ ν©λλ€.
λ λμ ν΄κ²°μ± μ μ μ μμ±μ λ λ§μ λ°μ΄ν°λ₯Ό ν¬ν¨μν€λ κ²μ΄λ©°, μ΄μ μ°λ¦¬κ° ν μΌμ λλ€.
'πΈ OpenGL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| OpenGL μ©μ΄ μ 리 (0) | 2023.11.19 |
|---|---|
| [Learn OpenGL] Shaders - 3 (0) | 2023.11.18 |
| [Learn OpenGL] Shaders - 1 (1) | 2023.11.18 |
| [Learn OpenGL] Hello Triangle - 4 (0) | 2023.11.18 |
| [Learn OpenGL] Hello Triangle - 3 (0) | 2023.11.17 |