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와 차이점이다.

반응형