More actions
imported>hit0473 No edit summary |
imported>hit0473 No edit summary |
||
| Line 20: | Line 20: | ||
== 점 크기 조절 및 안티알리어싱 적용 == | == 점 크기 조절 및 안티알리어싱 적용 == | ||
== 외곽선 내곽선을 구분짓는 상태적용 및 별 드로윙 == | |||
/* | |||
* @skyLibrary | |||
* Title : star drawing in 3D program | |||
* Date : 2013/7/7 ~ 2013/7/7 | |||
* How to use : | |||
* 1. use up, down, left, right key in your key board to move star in that way. | |||
* 2. click mouse right button and you can change the star shape statements by click each menu item. | |||
* Purpose : | |||
* just practice OpenGL. | |||
*/ | |||
#include <GL/glut.h> | |||
#define SOLID_MODE 1 | |||
#define LINE_MODE 2 | |||
#define POINT_MODE 3 | |||
int iMode = SOLID_MODE; | |||
GLboolean bEdgeFlag = true; | |||
static GLfloat xRot = 0.0f; | |||
static GLfloat yRot = 0.0f; | |||
void RenderScene() | |||
{ | |||
glClear(GL_COLOR_BUFFER_BIT); | |||
if(iMode == LINE_MODE) | |||
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); | |||
if(iMode == POINT_MODE) | |||
glPolygonMode(GL_FRONT_AND_BACK,GL_POINT); | |||
if(iMode == SOLID_MODE) | |||
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); | |||
glPushMatrix(); | |||
glRotatef(xRot, 1.0f, 0.0f, 0.0f); | |||
glRotatef(yRot, 0.0f, 1.0f, 0.0f); | |||
//start drawing triangle | |||
glBegin(GL_TRIANGLES); | |||
//setup kind of line which is outter line or not. | |||
glEdgeFlag(bEdgeFlag); | |||
glVertex2f(-20.0f, 0.0f); | |||
glEdgeFlag(TRUE); | |||
glVertex2f(20.0f, 0.0f); | |||
glVertex2f(0.0f, 40.0f); | |||
glVertex2f(-20.0f,0.0f); | |||
glVertex2f(-60.0f,-20.0f); | |||
glEdgeFlag(bEdgeFlag); | |||
glVertex2f(-20.0f,-40.0f); | |||
glEdgeFlag(TRUE); | |||
glVertex2f(-20.0f,-40.0f); | |||
glVertex2f(0.0f, -80.0f); | |||
glEdgeFlag(bEdgeFlag); | |||
glVertex2f(20.0f, -40.0f); | |||
glEdgeFlag(TRUE); | |||
glVertex2f(20.0f, -40.0f); | |||
glVertex2f(60.0f, -20.0f); | |||
glEdgeFlag(bEdgeFlag); | |||
glVertex2f(20.0f, 0.0f); | |||
glEdgeFlag(TRUE); | |||
// Center square as two triangles | |||
glEdgeFlag(bEdgeFlag); | |||
glVertex2f(-20.0f, 0.0f); | |||
glVertex2f(-20.0f,-40.0f); | |||
glVertex2f(20.0f, 0.0f); | |||
glVertex2f(-20.0f,-40.0f); | |||
glVertex2f(20.0f, -40.0f); | |||
glVertex2f(20.0f, 0.0f); | |||
glEdgeFlag(TRUE); | |||
glEnd(); | |||
glPopMatrix(); | |||
glutSwapBuffers(); | |||
} | |||
//menu event function | |||
void ClickMenu(int value) | |||
{ | |||
switch(value) | |||
{ | |||
case 1: iMode = SOLID_MODE; break; | |||
case 2: iMode = LINE_MODE; break; | |||
case 3: iMode = POINT_MODE; break; | |||
case 4: bEdgeFlag = true; break; | |||
case 5: | |||
default: bEdgeFlag = false; break; | |||
} | |||
//repaint by calling callback function | |||
glutPostRedisplay(); | |||
} | |||
//key event function | |||
void SpecialKeys(int key, int x, int y) | |||
{ | |||
if(key == GLUT_KEY_DOWN) | |||
{ | |||
xRot += 5.0f; | |||
} | |||
else if(key == GLUT_KEY_UP) | |||
{ | |||
xRot -= 5.0f; | |||
} | |||
else if(key == GLUT_KEY_LEFT) | |||
{ | |||
yRot += 5.0f; | |||
} | |||
else if(key == GLUT_KEY_RIGHT) | |||
{ | |||
yRot -= 5.0f; | |||
} | |||
if(key > 365.0f) | |||
xRot = 0.0f; | |||
if(key < -1.0f) | |||
xRot = 355.0f; | |||
if(key > 356.0f) | |||
yRot = 0.0f; | |||
if(key < -1.0f) | |||
yRot = 355.0f; | |||
//repaint by calling callback function | |||
glutPostRedisplay(); | |||
} | |||
//register backgroung color & base drawing color | |||
void SetupRC() | |||
{ | |||
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f); | |||
glColor3f(0.0f, 1.0f, 0.0f); | |||
//glShadeModel(GL_FLAT); | |||
//glFrontFace(GL_CCW); | |||
} | |||
void ChangeSize(int w, int h) | |||
{ | |||
GLfloat nRange = 100.0f; | |||
// Prevent a divide by zero | |||
if(h == 0) | |||
h = 1; | |||
// Set Viewport to window dimensions | |||
glViewport(0, 0, w, h); | |||
// Reset projection matrix stack | |||
glMatrixMode(GL_PROJECTION); | |||
glLoadIdentity(); | |||
// Establish clipping volume (left, right, bottom, top, near, far) | |||
if (w <= h) | |||
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange); | |||
else | |||
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange); | |||
// Reset Model view matrix stack | |||
glMatrixMode(GL_MODELVIEW); | |||
glLoadIdentity(); | |||
} | |||
void main() | |||
{ | |||
int nModeMenu; | |||
int nEdgeMenu; | |||
int nMainMenu; | |||
//register glut mode & create window | |||
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); | |||
glutCreateWindow("star"); | |||
//make Mode sub menu | |||
nModeMenu = glutCreateMenu(ClickMenu); | |||
glutAddMenuEntry("Solid", 1); | |||
glutAddMenuEntry("Outline", 2); | |||
glutAddMenuEntry("Points", 3); | |||
//make Edge boolean sub menu | |||
nEdgeMenu = glutCreateMenu(ClickMenu); | |||
glutAddMenuEntry("On", 4); | |||
glutAddMenuEntry("Off", 5); | |||
//make main menu that add Mode menu and Edge Menu | |||
nMainMenu = glutCreateMenu(ClickMenu); | |||
glutAddSubMenu("Mode", nModeMenu); | |||
glutAddSubMenu("Edge", nEdgeMenu); | |||
glutAttachMenu(GLUT_RIGHT_BUTTON); | |||
//register callback function & event function | |||
glutReshapeFunc(ChangeSize); | |||
glutSpecialFunc(SpecialKeys); | |||
glutDisplayFunc(RenderScene); | |||
SetupRC(); | |||
glutMainLoop(); | |||
} | |||
Revision as of 08:14, 7 July 2013
Describe OpenGL스터디_실습 코드 here
skyLibrary_include
Intro
- 이곳에 소스는 저의 github에도 올릴 예정이니 일일히 복붙하기 귀찮으신분들은 ""에서 받아가세요.
chapter 2. OpenGL 맛보기
사각형그리기(Rectangle)
사각형 애니메이션(RecAnime)
chapter 3. 공간 내의 드로윙, 지오메트리와 버퍼
나선형 점그리기
점 크기 조절 및 안티알리어싱 적용
외곽선 내곽선을 구분짓는 상태적용 및 별 드로윙
/*
* @skyLibrary
* Title : star drawing in 3D program
* Date : 2013/7/7 ~ 2013/7/7
* How to use :
* 1. use up, down, left, right key in your key board to move star in that way.
* 2. click mouse right button and you can change the star shape statements by click each menu item.
* Purpose :
* just practice OpenGL.
*/
#include <GL/glut.h>
#define SOLID_MODE 1
#define LINE_MODE 2
#define POINT_MODE 3
int iMode = SOLID_MODE;
GLboolean bEdgeFlag = true;
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
if(iMode == LINE_MODE)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
if(iMode == POINT_MODE)
glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
if(iMode == SOLID_MODE)
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
//start drawing triangle
glBegin(GL_TRIANGLES);
//setup kind of line which is outter line or not.
glEdgeFlag(bEdgeFlag);
glVertex2f(-20.0f, 0.0f);
glEdgeFlag(TRUE);
glVertex2f(20.0f, 0.0f);
glVertex2f(0.0f, 40.0f);
glVertex2f(-20.0f,0.0f);
glVertex2f(-60.0f,-20.0f);
glEdgeFlag(bEdgeFlag);
glVertex2f(-20.0f,-40.0f);
glEdgeFlag(TRUE);
glVertex2f(-20.0f,-40.0f);
glVertex2f(0.0f, -80.0f);
glEdgeFlag(bEdgeFlag);
glVertex2f(20.0f, -40.0f);
glEdgeFlag(TRUE);
glVertex2f(20.0f, -40.0f);
glVertex2f(60.0f, -20.0f);
glEdgeFlag(bEdgeFlag);
glVertex2f(20.0f, 0.0f);
glEdgeFlag(TRUE);
// Center square as two triangles
glEdgeFlag(bEdgeFlag);
glVertex2f(-20.0f, 0.0f);
glVertex2f(-20.0f,-40.0f);
glVertex2f(20.0f, 0.0f);
glVertex2f(-20.0f,-40.0f);
glVertex2f(20.0f, -40.0f);
glVertex2f(20.0f, 0.0f);
glEdgeFlag(TRUE);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
//menu event function
void ClickMenu(int value)
{
switch(value)
{
case 1: iMode = SOLID_MODE; break;
case 2: iMode = LINE_MODE; break;
case 3: iMode = POINT_MODE; break;
case 4: bEdgeFlag = true; break;
case 5:
default: bEdgeFlag = false; break;
}
//repaint by calling callback function
glutPostRedisplay();
}
//key event function
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_DOWN)
{
xRot += 5.0f;
}
else if(key == GLUT_KEY_UP)
{
xRot -= 5.0f;
}
else if(key == GLUT_KEY_LEFT)
{
yRot += 5.0f;
}
else if(key == GLUT_KEY_RIGHT)
{
yRot -= 5.0f;
}
if(key > 365.0f)
xRot = 0.0f;
if(key < -1.0f)
xRot = 355.0f;
if(key > 356.0f)
yRot = 0.0f;
if(key < -1.0f)
yRot = 355.0f;
//repaint by calling callback function
glutPostRedisplay();
}
//register backgroung color & base drawing color
void SetupRC()
{
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
//glShadeModel(GL_FLAT);
//glFrontFace(GL_CCW);
}
void ChangeSize(int w, int h)
{
GLfloat nRange = 100.0f;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset projection matrix stack
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
// Reset Model view matrix stack
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
int nModeMenu;
int nEdgeMenu;
int nMainMenu;
//register glut mode & create window
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("star");
//make Mode sub menu
nModeMenu = glutCreateMenu(ClickMenu);
glutAddMenuEntry("Solid", 1);
glutAddMenuEntry("Outline", 2);
glutAddMenuEntry("Points", 3);
//make Edge boolean sub menu
nEdgeMenu = glutCreateMenu(ClickMenu);
glutAddMenuEntry("On", 4);
glutAddMenuEntry("Off", 5);
//make main menu that add Mode menu and Edge Menu
nMainMenu = glutCreateMenu(ClickMenu);
glutAddSubMenu("Mode", nModeMenu);
glutAddSubMenu("Edge", nEdgeMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
//register callback function & event function
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
}