검색결과 리스트
로그의 노트에 해당되는 글 212건
- 2011.02.14 OpenGL ES 사용
- 2011.02.13 게임 시스템 모듈 구성
- 2011.02.13 DirectX 와 OpenGL
- 2011.02.13 visual studio2008 에서 커스텀 헤더파일과 라이브러리 포함시키기
- 2011.02.13 3차원의 기초
- 2011.02.13 3D 렌더링의 종류와 Java
- 2011.02.13 수학 교과과정 (초등학교~고등학교)
- 2011.02.13 OpenGL ES 사용설정
- 2011.01.20 Bash 스크립트
- 2011.01.10 [Ubuntu] NFS 사용하기
글
OpenGL ES 사용
아이폰
2011. 2. 14. 10:50
이미지 데이터 OpenGL ES 메모리로 로드하기
-(CGSize)loadTextureImage:(NSString*)imageName materialKey:(NSString*)materialKey
{
CGContextRef spriteContext; //context ref for the UIImage
GLubyte *spriteData; // a temporary buffer to hold our image data
size_t width, height;
GLuint textureID; // the ultimate ID for this texture
// grab the image off the file system, jam it into a CGImageRef
UIImage* uiImage = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];
CGImageRef spriteImage = [uiImage CGImage];
// Get the width and height of the image
width = CGImageGetWidth(spriteImage);
height = CGImageGetHeight(spriteImage);
CGSize imageSize = CGSizeMake(width, height);
// Texture dimensions must be a power of 2. If you write an application that allows users to supply an image,
// you'll want to add code that checks the dimensions and takes appropriate action if they are not a power of 2.
if (spriteImage) {
// Allocated memory needed for the bitmap context
spriteData = (GLubyte *) malloc(width * height * 4);
memset(spriteData, 0, (width * height * 4));
// Uses the bitmatp creation function provided by the Core Graphics framework.
spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width * 4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the sprite image to the context.
CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage);
// You don't need the context at this point, so you need to release it to avoid memory leaks.
CGContextRelease(spriteContext);
// Use OpenGL ES to generate a name for the texture.
glGenTextures(1, &textureID);
// Bind the texture name.
glBindTexture(GL_TEXTURE_2D, textureID);
// Specidfy a 2D texture image, provideing the a pointer to the image data in memory
//Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRGGGGBBBBAAAA"
// this will make your images take up half as much space in memory
// but you will lose half of your color depth.
if (BB_CONVERT_TO_4444) {
void* tempData;
unsigned int* inPixel32;
unsigned short* outPixel16;
tempData = malloc(height * width * 2);
inPixel32 = (unsigned int*)spriteData;
outPixel16 = (unsigned short*)tempData;
NSUInteger i;
for(i = 0; i < width * height; ++i, ++inPixel32)
*outPixel16++ = ((((*inPixel32 >> 0) & 0xFF) >> 4) << 12) | ((((*inPixel32 >> 8) & 0xFF) >> 4) << 8) | ((((*inPixel32 >> 16) & 0xFF) >> 4) << 4) | ((((*inPixel32 >> 24) & 0xFF) >> 4) << 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, tempData);
free(tempData);
} else {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
}
free(spriteData);
// Release the image data
// Set the texture parameters to use a minifying filter and a linear filer (weighted average)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// Enable use of the texture
glEnable(GL_TEXTURE_2D);
// Set a blending function to use
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// Enable blending
glEnable(GL_BLEND);
} else {
return CGSizeZero;
}
[uiImage release];
if (materialLibrary == nil) materialLibrary = [[NSMutableDictionary alloc] init];
// now put the texture ID into the library
[materialLibrary setObject:[NSNumber numberWithUnsignedInt:textureID] forKey:materialKey];
return imageSize;
}
정점그리기
-(void)render
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
// load arrays into the engine
glVertexPointer(vertexSize, GL_FLOAT, 0, vertexes);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(colorSize, GL_FLOAT, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
//render
glDrawArrays(renderStyle, 0, vertexCount);
}
텍스처 그리기
-(void)render
{
glVertexPointer(vertexSize, GL_FLOAT, 0, vertexes);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(colorSize, GL_FLOAT, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
if (materialKey != nil) {
[[BBMaterialController sharedMaterialController] bindMaterial:materialKey];
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);
}
//render
glDrawArrays(renderStyle, 0, vertexCount);
}
'아이폰' 카테고리의 다른 글
| Sprite Sheet 제작툴 Zwoptex (0) | 2011.03.16 |
|---|---|
| 애플리케이션 응답성 향상을 위해 동시성 사용하기 (0) | 2011.03.15 |
| OpenGL ES 게임 프레임웍 (0) | 2011.02.14 |
| OpenGL ES 사용 (0) | 2011.02.14 |
| OpenGL ES 사용설정 (0) | 2011.02.13 |
| [iPhone] 로깅 프레임웍 cocoalumberjack (0) | 2010.12.21 |
설정
트랙백
댓글
글
게임 시스템 모듈 구성
게임개발로그
2011. 2. 13. 23:42
일반적인 게임 시스템의 구조는 다음과 같다. 각 모듈별로 설명하기가...귀차니즘...OTZ
'게임개발로그' 카테고리의 다른 글
| 아이폰 2D 게임엔진 Cocos2D (1) | 2011.03.16 |
|---|---|
| 게임 개발 기초 (2) | 2011.02.14 |
| 게임 시스템 모듈 구성 (0) | 2011.02.13 |
| DirectX 와 OpenGL (0) | 2011.02.13 |
| 3차원의 기초 (0) | 2011.02.13 |
| 3D 렌더링의 종류와 Java (0) | 2011.02.13 |
설정
트랙백
댓글
글
DirectX 와 OpenGL
게임개발로그
2011. 2. 13. 23:13
OpenGL은 DirectX 가 개발되기 전인 1992년 3D 그래픽을 주도하던 SGI 사에 개발한 3차원 SDK이다.
초창기 OpenGL을 사용하기 위해서는 고가의 그래픽 가속기를 장착해야만 했다. Microsoft 사는 3차원
렌더링이 저사양 기계에서도 동작할 수 있는 가벼운 SDK로 DirectX를 만들게 되었다.
OpenGL과 DirectX의 우열을 따지는 것은 큰 의미가 없으며, 개발 게임의 목표 플랫폼이 무엇인지를
고려해야 한다. windows XP에서는 OpenGL1.1을, Vista에서는 OpenGL 1.4를 opengl32.dll 형태로
제공하지만, 최신버전을 지원하는 일에는 매우 소극적이다.
DirectX는 Mircrosoft 운영체제에서만 작동하며, 많은 부분 OpenGL의 기본원리들을 가져다 사용한다.
하지만 PC 운영체제 시장 대부분을 윈도우가 점유하고 있기 때문에, 게임업계에서는 DirectX가 사실상
표준으로 자리매김하고 있다.
자신이 개발하는 게임의 대상 플랫폼에 적절한 3차원 SDK를 사용하자.
초창기 OpenGL을 사용하기 위해서는 고가의 그래픽 가속기를 장착해야만 했다. Microsoft 사는 3차원
렌더링이 저사양 기계에서도 동작할 수 있는 가벼운 SDK로 DirectX를 만들게 되었다.
OpenGL과 DirectX의 우열을 따지는 것은 큰 의미가 없으며, 개발 게임의 목표 플랫폼이 무엇인지를
고려해야 한다. windows XP에서는 OpenGL1.1을, Vista에서는 OpenGL 1.4를 opengl32.dll 형태로
제공하지만, 최신버전을 지원하는 일에는 매우 소극적이다.
DirectX는 Mircrosoft 운영체제에서만 작동하며, 많은 부분 OpenGL의 기본원리들을 가져다 사용한다.
하지만 PC 운영체제 시장 대부분을 윈도우가 점유하고 있기 때문에, 게임업계에서는 DirectX가 사실상
표준으로 자리매김하고 있다.
자신이 개발하는 게임의 대상 플랫폼에 적절한 3차원 SDK를 사용하자.
'게임개발로그' 카테고리의 다른 글
| 아이폰 2D 게임엔진 Cocos2D (1) | 2011.03.16 |
|---|---|
| 게임 개발 기초 (2) | 2011.02.14 |
| 게임 시스템 모듈 구성 (0) | 2011.02.13 |
| DirectX 와 OpenGL (0) | 2011.02.13 |
| 3차원의 기초 (0) | 2011.02.13 |
| 3D 렌더링의 종류와 Java (0) | 2011.02.13 |
설정
트랙백
댓글
글
visual studio2008 에서 커스텀 헤더파일과 라이브러리 포함시키기
개발도구로그
2011. 2. 13. 21:54
도구메뉴 > 옵션 > 프로젝트 및 솔루션 > VC++ 디렉토리 에서 임의의 헤더파일과 라이브러리를 포함시킬 수 있다.
'개발도구로그' 카테고리의 다른 글
| [Xcode] 지원 시뮬레이터 목록을 출력하는 명령 (0) | 2014.10.20 |
|---|---|
| [Vi] Vi 사용하기 (0) | 2011.04.25 |
| [SVN] Subversion 명령들 (0) | 2011.03.18 |
| visual studio2008 에서 커스텀 헤더파일과 라이브러리 포함시키기 (0) | 2011.02.13 |
| [VC2008] 라인넘버 표시 (0) | 2010.12.13 |
| [VC2008] 문자 셋 변경 (0) | 2010.12.13 |
설정
트랙백
댓글
글
3차원의 기초
게임개발로그
2011. 2. 13. 21:05
3차원상의 모델을 2차원의 모니터 화면으로 변환 또는 투영하는 것이다. 이러한 과정은 카메라에서
볼 수 있는 시야각(화각)을 정의하고, 이 시야각에 들어오는 3차원 상의 물체좌표를 삼각함수와
간단한 비례공식을 이용하여 2차원상의 좌표로 변환하여 이루어진다.
수학적으로 표현한 3차원 공간은 데카르트 좌표계를 사용하고, 모니터는 그 특성상 화면좌표계를 사용한다.
화면 좌표계는 좌측상단이 원점(0,0)이고 아래방향으로 갈수록 y가 증가하지만, 대부분의 게임 3차원 공간에서
사용하는 데카르트 좌표계는 좌측하단을 0,0으로 하여 위로 갈수록 y가 증가한다. 이러한 좌표 차이로 인해
둘 간에 적절한 변환이 이루어져야 한다.
결국 3차원 엔진이라는 것은 수학적으로 가상의 3차원 공간을 설정하고, 그것에 대한 연산을 하여 2차원으로
변경하고 그리는 과정이다. 끊김없이 부드럽게 보여줘야 하기 때문에, 불필요한 수학연산을 하지않고 최소화
하는 것이 중요하다. 그래서 카메라 시야각에 존재하는 모든 사물을 그리는 것은 비효율적이기 때문에
잘려진 피라미드 모양의 절두체 공간에 존재하는 사물만을 그린다.
또 그 공간 안에서 카메라에 가까이 있는 물체가 뒤의 물체를 가리게 될 경우, 뒤 물체는 그릴 필요가 없어진다.
즉 보이지 않는 면에 대해서는 (화면에) 그릴 필요가 없는 것이다. 절두체의 경계에 걸려있는 물체는 다 그려질
필요없이 보여질 부분만 잘라내어 그리면 좀더 효율적으로 그릴 수 있게된다.
'게임개발로그' 카테고리의 다른 글
| 아이폰 2D 게임엔진 Cocos2D (1) | 2011.03.16 |
|---|---|
| 게임 개발 기초 (2) | 2011.02.14 |
| 게임 시스템 모듈 구성 (0) | 2011.02.13 |
| DirectX 와 OpenGL (0) | 2011.02.13 |
| 3차원의 기초 (0) | 2011.02.13 |
| 3D 렌더링의 종류와 Java (0) | 2011.02.13 |
설정
트랙백
댓글
글
3D 렌더링의 종류와 Java
게임개발로그
2011. 2. 13. 20:55
광선 추적법(ray tracing)
실세계의 빛을 모델링하는 것과 유사하다. 하지만 광원으로부터 우리의 눈으로 오는 광선을 모델링하는 대신,
반대로 우리 눈이 세계를 바라보는 광선을 모델링한다. 스크린 상의 모든 픽셀에 대한 광선을 모델링하는 것은
산술적으로 많은 비용이 들기 때문에 3차원 그래픽에서 잘 사용되지 않지만, 더 현식적인 결과를 보여준다.
다각형 모델링(polygon modeling)
실시간 게임과 컴퓨터가 생성한 이미지를 사용하는 영화에서는 3차원 렌더링 기술로 다각형 모델링을 사용한다.
polygon modeling에서는 3차원 세계를 편평한 다각형으로 해석한다. 다각형은 편평하지만, 3개 이상의 변을 갖는
도형이다. 렌더링 속도가 빠르지만, 둥근 구와 같은 객체는 충분한 개수의 다각형을 사용하지 않으면, 잘 표현이
되지 않는다. 3차원 가속카드와 같은 하드웨어를 사용하여 속도를 가속화 시킬 수 있다.
자바 3D 렌더링
Java3D는 은면제거, 충돌검사, Scene 관리를 처리해주는 하이레벨 API이다. Java3D는 자바로 작성되었지만,
코어에서 3D 렌더링을 위해 OpenGL과 DirectX를 사용한다. Java3D는 윈도우와 리눅스에서도 사용가능하지만,
라이센스 문제로 SDK 1.4.1에 포함되지 않았으며, Mac OS X에서는 사용할 수 없다.
반면 자바 OpenGL 바인딩은 상업용 제품을 위해 무료로 사용가능하며, Mac OS X를 포함한 다양한 하드웨어에서
사용가능하다. OpenGL API는 저수준 API이며, 장점을 활용하기 위해서는 3차원 그래픽 프로그래밍에 대해
더 많은 지식을 필요로한다. OpenGL 바인딩은 단순히 자바코드를 OpenGL 형식으로 접근할 수 있게한다.
잘 알려진 자바 OpenGL 바인딩으로 GL4Java(www.jausoft.com/gl4java.html)와 LWJGL(java-game-lib.sourceforge.net)가
있다. GL4 Java는 AWT, Swing 과 함께 사용할 수 있으며 더 많은 시스템에서 사용가능하지만 업데이트가 되지않아
최신의 OpenGL 기능을 사용할 수 없다.
LWJGL (Light-Weight Java Game Library)는 OpenGL과 상호작용하기 위해 NIO native 버퍼를 사용하기 때문에
속도가 더 빠르다. 현재 정기적으로 업데이트 되고 있지만, AWT, Swing과 호환하여 사용할 수 없다.
소프트웨어 기반의 3차원 폴리곤 렌더러는, 하드웨어 기반의 렌더러 보다 속도가 더 느리지만 큰 스케일의 게임을
위한 솔루션으로 적합하다. 소프트웨어 기반의 3D 렌더러를 구축하는 과정에서 하드웨어 기반 렌더러의 동작방식을
이해하게 되고, 하드웨어 렌더러에도 적용할 수 있는 많은 3D 그래픽 기술을 배울 수 있다.
'게임개발로그' 카테고리의 다른 글
| 아이폰 2D 게임엔진 Cocos2D (1) | 2011.03.16 |
|---|---|
| 게임 개발 기초 (2) | 2011.02.14 |
| 게임 시스템 모듈 구성 (0) | 2011.02.13 |
| DirectX 와 OpenGL (0) | 2011.02.13 |
| 3차원의 기초 (0) | 2011.02.13 |
| 3D 렌더링의 종류와 Java (0) | 2011.02.13 |
설정
트랙백
댓글
글
수학 교과과정 (초등학교~고등학교)
학습로그/수학
2011. 2. 13. 17:50
초등학교 교과과정
중학교 교과과정
중학교 수학교과서는 개정되어, 수학1 수학2로 구성되어 있는 듯...하다. 특이한 것은 "수학1 익힘, 수학2 익힘2 교재가
별도로 있어서 다양한 문제를 풀어볼 수 있게 한것 같았다.
목차는 교학사 사이트를 참고하였다.
| 수학1 | 수학2 |
고등학교 교과과정
고등학교는 수학, 수학1, 수학2, 기하와 벡터, 미적분학과 통계 과목이 있었다.
고등학교는 수학, 수학1, 수학2, 기하와 벡터, 미적분학과 통계 과목이 있었다.
| 수학 | 수학1, 수학2 |
| |
|
| 기하와 벡터 | 미적분학과 통계 |
| |
'학습로그 > 수학' 카테고리의 다른 글
| 일반각과 호도법 (0) | 2011.02.14 |
|---|---|
| 삼각함수의 성질 (0) | 2011.02.14 |
| 삼각함수 (0) | 2011.02.14 |
| 벡터연산을 위한 클래스 구현(cpp) (0) | 2011.02.14 |
| 벡터 연산(Vector Operations) (0) | 2011.02.14 |
| 수학 교과과정 (초등학교~고등학교) (0) | 2011.02.13 |
설정
트랙백
댓글
글
OpenGL ES 사용설정
아이폰
2011. 2. 13. 01:51
아이폰에서는 Core Animation의 CAEAGLayer 클래스를 통하여, OpenGL ES 엔진을 사용한 그래픽 하드웨어 연산을
추상화 해준다. UIView의 서브클래스에 일반 코어애니메이션 레이어가 아닌 CAEAGLayer 를 추가하면, UIView의
drawRect 메소드가 아닌 표준 OpenGL ES 함수호출을 통헤 드로잉 작업을 할 수 있게된다.
OpenGL ES를 사용하기 위해 EAGLView 클래스를 생성해보자. "Beginning iPhone Game Development (출판사:Apress) " 를
참고하였다. (물론 이 책도 애플 OpenGL ES 개발자 레퍼런스의 샘플을 수정한 예제를 제공한 것이다.)
1. 먼저 OpenGLES.framework와 QuartzCore.framework 를 프레젝트에 추가한다
2. EAGLView 클래스 정의는 다음과 같다.
#import <UIKit/UIKit.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>
@interface EAGLView : UIView {
@private
// 백버퍼의 넓이, 높이
GLint backingWidth;
GLint backingHeight;
EAGLContext *context;
// 렌더버퍼, 프레임버퍼 식별자
GLuint viewRenderbuffer, viewFramebuffer;
// 깊이 버퍼, 사용하지 않으면 0
GLuint depthRenderbuffer;
}
- (void)beginDraw;
- (void)finishDraw;
- (void)setupViewLandscape;
- (void)setupViewPortrait;
3. UIView 클래스의 +(Class)layerClass 메소드를 오버라이드하여, CAEAGLayer 반환하도록 하여 OpenGL 드로잉을 가능하게 한다
+ (Class)layerClass {
return [CAEAGLLayer class];
}
4. 드로잉 목적에 맞게 CAEAGLayer 의 속성을 설정하고, Context 생성
- (id)initWithFrame:(CGRect)rect {
if ((self = [super initWithFrame:rect])) {
// Get the layer
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context]) {
[self release];
return nil;
}
self.multipleTouchEnabled = YES;
}
return self;
}
5. 프레임 버퍼와 렌더링 버퍼를 생성한다.
렌더버퍼는 색상 등의 데이터로 채워진 2차원 표면이고, 프레임버퍼는 여러 렌더버퍼로 구성된다.
(이 예제에서 프레임버터에 렌더버퍼와 깊이 버퍼를 연결하였다. )
- (void)layoutSubviews
{
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];
[self setupViewLandscape];
}
- (BOOL)createFramebuffer {
// 프레임버퍼와, 렌더버퍼를 위한 식별자 값 얻기 (식별자는 GLuint 형 타입)
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);
// 파이프라인에 바인딩
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
// 렌더버퍼 메모리 할당
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
// 렌더버퍼를 프레임버퍼에 연결
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
// 깊이 버퍼도 사용한다면, 위와 동일한 과정으로 생성후 프레임버퍼에 연결
if (USE_DEPTH_BUFFER) {
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}
return YES;
}
- (void)destroyFramebuffer {
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;
if(depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}
6. 뷰포트와 투영변환을 설정한다
- (void)setupViewLandscape
{
// Sets up matrices and transforms for OpenGL ES
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
// set up the viewport so that it is analagous to the screen pixels
glOrthof(-backingHeight/2.0, backingHeight/2.0, -backingWidth/2.0, backingWidth/2.0, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
// Clears the view with black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
7. 카메라를 위치를 설정한다.
-(void)perspectiveFovY:(GLfloat)fovY
aspect:(GLfloat)aspect
zNear:(GLfloat)zNear
zFar:(GLfloat)zFar
{
const GLfloat pi = 3.1415926;
// Half of the size of the x and y clipping planes.
// - halfWidth = left, halfWidth = right
// - halfHeight = bottom, halfHeight = top
GLfloat halfWidth, halfHeight;
// Calculate the distance from 0 of the y clipping plane. Basically trig to calculate
// position of clip plane at zNear.
halfHeight = tan( (fovY / 2) / 180 * pi ) * zNear;
// Calculate the distance from 0 of the x clipping plane based on the aspect ratio.
halfWidth = halfHeight * aspect;
// Finally call glFrustum with our calculated values.
glFrustumf( -halfWidth, halfWidth, -halfHeight, halfHeight, zNear, zFar );
}
8. 렌더링한다.
-(void)beginDraw
{
// Make sure that you are drawing to the current context
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
// make sure we are in model matrix mode and clear the frame
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
// set a clean transform
glLoadIdentity();
}
-(void)finishDraw
{
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
실제로 5번 과정까지가 EAGLView를 사용하기 위한 준비단계이며 한번 설정이 되면 거의 바뀌지 않는 부분들이다.
6번 이후 과정부터는 애플리케이션에 따라 사용자 입력에 대한 렌더링을 수행하는 작업들이다.
'아이폰' 카테고리의 다른 글
| Sprite Sheet 제작툴 Zwoptex (0) | 2011.03.16 |
|---|---|
| 애플리케이션 응답성 향상을 위해 동시성 사용하기 (0) | 2011.03.15 |
| OpenGL ES 게임 프레임웍 (0) | 2011.02.14 |
| OpenGL ES 사용 (0) | 2011.02.14 |
| OpenGL ES 사용설정 (0) | 2011.02.13 |
| [iPhone] 로깅 프레임웍 cocoalumberjack (0) | 2010.12.21 |
설정
트랙백
댓글
글
Bash 스크립트
운영체제로그/Linux
2011. 1. 20. 22:33
리눅스를 서버로 자바언어 기반의 웹서비스를 운영하려고 준비하다가, 로그를
시간, 일일 단위로 수집하여 에러가 발생하면 메일로 전송해주는 기능을 작성해야할 일이 생겼다.
스프링에서 지원해주는 스케줄링과 메일전송 기능을 사용할 수도 있지만, crontab과 몇 가지 리눅스 유틸리티를
사용해서도 쉽게 해결할 수 있는 일이다.
일단 스크립트에 익숙지 않기 때문에 Bash 스크립트 구문을 간략히 정리해보고 원하는 기능을 구현해보자
사용자의 디폴트쉘은 /etc/password 파일에 사용자 엔트리에 기반하여 적용이 되며, 대부분 bash(/bin/bash)가 사용된다.
bash 쉘은 시작시에 /etc/profile 파일을 읽어서 모든 사용자에 쉘환경에 적용을 한다. 사용자 홈디렉토리에 위치하고 있는
.bash_profile, .bash_login, .profile 파일은 현재 쉘환경만 적용이 된다. 쉘이 닫힐 때는 ~/.bash_logout 파일이 실행이 된다.
1 스크립트 실행
스크립트를 실행하기 위해서는, 파일에 실행권한을 부여해야 한다.
$chmod u+x myscript.sh
bash 명령을 주어 명시적으로 실행하려면, 스크립트 파일의 가장 첫라인은 다음과 같이 시작해야 한다.
#!/bin/bash
2 변수선언과 테스트문
테스트문은 참과 거짓을 판별하는 표현식으로 대괄호[] 안에 표시를 한다. 변수를 선언하고 테스트문을 사용하는 예이다.
MYSTRING=abc if [ $MYSTRING = abc ] ; thenecho “The variable is abc” if
위 예에서는 MYSTRING 이라는 변수를 선언하고 그 값이 "abc" 와 같은면 메시지를 출력하고 있다.
다음은 테스트문에서 수를 비교하는 예이다.
MYNUMBER=1
if [ $MYNUMBER -eq 1 ] ; then
echo “MYNUMBER equals 1”;
fi
if [ $MYNUMBER -lt 2 ] ; then
echo “MYNUMBER <2”;
fi
if [ $MYNUMBER -le 1 ] ; then
echo “MYNUMBER <=1”;
fi
if [ $MYNUMBER -gt 0 ] ; then
echo “MYNUMBER >0”;
fi
if [ $MYNUMBER -ge 1 ] ; then
echo “MYNUMBER >=1”;
fi
각각 MYNUMBER 변수에 있는 값을 비교하여 메시지를 출력하고 있다. 테스문에서 사용한 기호는 각각 =, <, <=, >, >= 를 의미한다. 다음은 파일에 대한 테스문 예이다.
filename=”$HOME”
if [ -e $filename ] ; then
echo “$filename exists”;
fi
if [ -f “$filename” ] ; then
echo “$filename is a regular file”
elif [ -d “$filename” ] ; then
echo “$filename is a directory”
else
echo “I have no idea what $filename is”
fi
위에서 사용한 테스트문 연산자에 대해서 알아보자 .
| 연산자 | 의미 | 연산자 | 의미 |
| -e(a) file | 파일이 존재하는지 검사 | expr1 -a expr2 | and |
| -d file | 파일이 디렉토리인지 검사 | expr1 -o expr2 | or |
| -f file | 파일이 일반파일인지 검사 | file1 -nt file2 | modification time is newer than |
| -L(f) file | 파일이 심볼릭 링크인지 검사 | file1 -ot file2 | modification time older than |
| -n string | 문자열길이가 0보다 큰지검사 | file1 -ef file2 | 두 파일이 링크로 연결유무 |
| -z string | 문자열길이가 0인지 검사 | var1 -ne(!=) var2 | not equal |
| -o file | 파일을 소유하고 있는지검사 | var1 -eq(=) var2 | equal |
| -r file | 파일을 읽을 수 있는지 검사 | var1 -ge var2 | equal or greater than |
| -w file | 파일을 쓸 수 있는지 검사 | var1 -gt var2 | greater than |
| - x file | 파일을 쓸 수 있는지 검사 | var1 -le var2 | less than or equal |
| -s file | 파일이 존재하고, 0바이트보다 큰지 검사 |
var1 -lt var2 | less than |
3 case 문 (c언어의 switch 문)
case “$VAR” in
string1)
{ action1 };;
string2)
{ action2 };;
*)
{ default action } ;;
esac
4 for 문
for NUMBER in 0 1 2 3 4 5 6 7 8 9 do echo The number is $NUMBER done아래와 같이 backtick(`)으로 감싸 ls 명령을 수행한 결과에 대해서 반복을 할수도 있다.
for FILE in `/bin/ls`; do
echo $FILE;
done
5 while문
변수를 카운트하여 루프를 도는 예이다.
VAR=0
while [ $VAR -lt 3 ]; do
echo $VARVAR=$[$VAR+1]
Done
6 until 문
until 구문을 사용하여, while 문과 동일한기능을 수행할 수 있다.
VAR=0 until [ $VAR -eq 3 ]; do echo $VAR; VAR=$[$VAR+1]; done
'운영체제로그 > Linux' 카테고리의 다른 글
| 리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard) (0) | 2011.03.09 |
|---|---|
| su, sudo : 특정 사용자 권한으로 쉘/명령 실행 (0) | 2011.03.08 |
| cURL (0) | 2011.02.18 |
| grub에서 디폴트 부팅 os 변경하기 (0) | 2011.02.16 |
| Bash 스크립트 (0) | 2011.01.20 |
| [Ubuntu] NFS 사용하기 (0) | 2011.01.10 |
설정
트랙백
댓글
글
[Ubuntu] NFS 사용하기
운영체제로그/Linux
2011. 1. 10. 00:05
NFS(Network File System) 은 원격호스트에 있는 파일시스템을 로컬 하드인 것처럼 사용할 수 있는
선마이크로 시스템즈사에 의해 개발된 파일시스템이다. 지금과 같이 파일공유가 되지 않았던 예전에 많이 사용되었던
방식이라고 한다. NFS는 서버 / 클라이언트 모델로 동작하는데, 파일소스를 제공하는 측이 서버가 되고, 파일소스를 이용하는
측이 클라이언트가 된다.
서버와 클라이언트 에서 공통으로 사용하는 모듈로, showmount, nfsstat 등의 유틸리티가 포함되어 있다.
우분투/데비안에서, NSF 클라이언트로 동작하기 위해서는 nfs-common, portmap 패키지가 필요하며,
서버로 동작하기 위해서는 nfs-common, portmap, nfs-kernel-server, 패키지가 필요하다. 이름대로 nfs-common 패키지는 서버와 클라이언트 에서 공통으로 사용하는 모듈로, showmount, nfsstat 등의 유틸리티가 포함되어 있다.
이제 NFS 를 설치해보자.
1. 패키지 설치 (서버, 클라이언트 패키지 모두 설치)
# apt-get install nfs-kernel-server nfs-common portmap
2. /etc/exports 파일에 공유폴더 설정하기 (서버측 설정)
/folderToShare1 192.168.1.10(rw,no_root_squash,async) /folderToShare2 192.168.1.1/24(rw,no_root_squash,async)
exports 설정파일은 <공유폴더 공유호스트1(옵션) 공유호스트2(옵션) ...> 와 같은 형태를 따른다.
한줄에 여러 호스트를 지정할 수 있으며, 2번줄처럼 서브넷마스크를 적어주어 ip범위(1~255)를 지정해
줄 수도 있다. 참고로 맥에서 공유폴더를 마운트하기 위해서는 반드시 insecure 옵션을 명시해 주어야 한다.
3. export 파일을 편집했다면 nfs 데몬을 재실행하여 변경사항을 적용해 준다 (서버측 설정)
# sudo /etc/init.d/nfs-kernel-server restart
4. 클라이언트에서 원격호스트 폴더를 마운트하여 사용한다. (클라이언트측 설정)
# mkdir ~/mymount # cd ~ # sudo mount servername:/folderToShare1 ~/mymount서버의 exports 파일에 명시된 호스트라면, mymount 디렉토리에 /folderToShare1 서브디렉토리들이 마운트되어
이후에는 로컬 디스크처럼 사용할 수 있다.
5. 마운트를 해제하기 위해서는 아래와 같이 한다
#umount ~/mymount
'운영체제로그 > Linux' 카테고리의 다른 글
| 리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard) (0) | 2011.03.09 |
|---|---|
| su, sudo : 특정 사용자 권한으로 쉘/명령 실행 (0) | 2011.03.08 |
| cURL (0) | 2011.02.18 |
| grub에서 디폴트 부팅 os 변경하기 (0) | 2011.02.16 |
| Bash 스크립트 (0) | 2011.01.20 |
| [Ubuntu] NFS 사용하기 (0) | 2011.01.10 |