OpenGL

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

Let it out 2024. 2. 19. 19:58
반응형

쉐이더 란?

쉐이더는 색상, 명암, 색조 등을 조절 해준다는 뜻을 가지고 있다.
 
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와 차이점이다.

 

 

반응형