[OpenGL] OpenGL 쉐이더(shader) 구현하기

OpenGL 쉐이더(shader) 구현하기


쉐이더 란?

쉐이더는 색상, 명암, 색조 등을 조절 해준다는 뜻을 가지고 있다.
쉐이더는 teapot, wireCube, sphere 등은 구현이 안되므로 직접 model 데이터를 제작해서 rgb 값을 할당 후 쉐이딩을 해줘야 한다.

쉐이딩 기법 순서

1. 삼각형을 그리기 위해서 3개의 vertex를 찍어 준다.
2. vertex 마다 다르게 색상을 준다.
3. GL_FLAT 나 GL_SMOOTH를 사용해서 RGB를 filling 해준다.
4. 결과가 나온다.


GL_SMOOTH 로 쉐이딩 해주기

삼각형을 그리고 GL_SMOOTH 모드로 쉐이딩 해주는 코드.
#include <GL/freeglut.h>
#include <stdio.h>

void draw(void)
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0); // 배경 색상
    glFrustum(-1, 1, -1, 1, 1, 100);

    glShadeModel(GL_SMOOTH); // GL_SMOOTH or GL_FLAT
    glBegin(GL_POLYGON);

    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//red
    glVertex3f(0.0, 0.5, -1.0);

    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);//green
    glVertex3f(-0.5, -0.5, -1.0);

    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);//blue
    glVertex3f(0.5, -0.5, -1.0);

    glEnd();
    glFlush();
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(800, 200);
    glutCreateWindow("Example");

    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);

    glutDisplayFunc(draw);
    glutMainLoop();
}


실행 결과



GL_FLAT 으로 쉐이딩 해주기

GL_FLAT으로 쉐이딩 하는 코드
#include <GL/freeglut.h>
#include <stdio.h>

void draw(void)
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0); // 배경 색상
    glFrustum(-1, 1, -1, 1, 1, 100);

    glShadeModel(GL_FLAT); // GL_SMOOTH or GL_FLAT
    glBegin(GL_POLYGON);

    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//red 가장 먼저인 레드가 쉐이딩 된다.
    glVertex3f(0.0, 0.5, -1.0);

    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);//green
    glVertex3f(-0.5, -0.5, -1.0);

    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);//blue
    glVertex3f(0.5, -0.5, -1.0);

    glEnd();
    glFlush();
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowPosition(800, 200);
    glutCreateWindow("Example");

    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);

    glutDisplayFunc(draw);
    glutMainLoop();
}


실행 결과

제일 먼저 컬러를 입힌 red로 쉐이딩이 된다. GL_SMOOTH와 다른 점이다.


댓글

이 블로그의 인기 게시물

[Arduino] 아두이노 초음파 센서(HC-SR04) 사용하기

[Arduino] 아두이노 조이스틱 사용하기

[자연 환경] 농약의 장단점 농약이 환경과 인간에게 미치는 영향