E D R , A S I H C RSS

OpenGL스터디_실습 코드 (rev. 1.6)

OpenGL스터디_실습 코드


skyLibrary_include


1. Intro


  • 이곳에 소스는 저의 github에도 올릴 예정이니 일일히 복붙하기 귀찮으신분들은 ""에서 받아가세요.

2. chapter 2. OpenGL 맛보기


2.1. 사각형그리기(Rectangle)


2.2. 사각형 애니메이션(RecAnime)


3. chapter 3. 공간 내의 드로윙, 지오메트리와 버퍼


3.1. 나선형 점그리기


3.2. 점 크기 조절 및 안티알리어싱 적용



3.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();
}


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:56
Processing time 0.0209 sec