Computer Graphics/ShaderPixel

ShaderPixel - 12. 2d shader (Kaleidoscope) 추가

surkim 2024. 11. 22. 22:03

과제의 "A 2D shader of your choice that uses a renderbuffer" 항목에 해당하는 Kaleidoscope(만화경) 효과를 추가하였다.

 

이번 구현은 Shadertoy의 Kaleidoscope 예제를 참고하여 OpenGL 환경에 맞게 수정했다.

이전 오브젝트와 마찬가지로 먼저 프레임버퍼에 만화경 효과를 렌더링하고, 텍스처로 플레인에 적용하여 화면에 출력하는 방식으로 구현했다.

2D 셰이더 렌더링

// start 2d shader - kaleidoscope
m_kaleidoscopeFramebuffer->Bind();
auto& colorAttachment2D = m_kaleidoscopeFramebuffer->GetColorAttachment(0);
glViewport(0, 0, m_width, m_height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

m_kaleidoscopeProgram->Use();
model = glm::mat4(1.0f);
m_kaleidoscopeProgram->SetUniform("transform", glm::scale(glm::mat4(1.0f), glm::vec3(2.0f)));
m_kaleidoscopeProgram->SetUniform("uResolution", glm::vec2(m_width, m_height));
m_kaleidoscopeProgram->SetUniform("uTime", uTime);
uTime += 0.01f;

m_plane->Draw(m_kaleidoscopeProgram.get());
// end 2d shader - kaleidoscope
  • 만화경 효과를 프레임버퍼에 먼저 렌더링.

플레인에 텍스처 적용

// start 2d shader - kaleidoscope
m_textureProgram->Use();
model = glm::mat4(1.0f);
model = glm::translate(model, m_kaleidoscopePos);
model = glm::scale(model, glm::vec3(2.0f));
model = glm::rotate(model, glm::radians(180.f), glm::vec3(0.0f, 1.0f, 0.0f));
m_textureProgram->SetUniform("transform", projection * view * model);

glActiveTexture(GL_TEXTURE0);
colorAttachment2D->Bind();
m_textureProgram->SetUniform("tex", 0);

m_plane->Draw(m_textureProgram.get());
// end 2d shader - kaleidoscope
  • colorAttachment2D에서 프레임버퍼에 저장된 결과를 불러와 플레인에 적용.

3. 프레임 추가

만화경 효과의 테두리를 강조하기 위해 플레인 주변에 프레임을 렌더링했다.

m_simpleProgram->Use();
model = glm::mat4(1.0f);
model = glm::translate(model, m_kaleidoscopePos);
model = glm::scale(model, glm::vec3(1.2f, 1.0f, 1.0f));
model = glm::rotate(model, glm::radians(180.f), glm::vec3(0.0f, 1.0f, 0.0f));
m_simpleProgram->SetUniform("transform", projection * view * model);
m_simpleProgram->SetUniform("color", glm::vec4(1.0f, 0.8f, 0.6f, 1.0f));

m_pictureFrame->Draw(m_simpleProgram.get());

결과