#title OpenGL스터디_실습 코드 Describe [OpenGL스터디_실습 코드] here [[TableOfContents]] 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 #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(); } }}}