1.비디오 메모리 잠그기 2.화면에 픽셀찍기 학습목표

Slides:



Advertisements
Similar presentations
1 Copyright ⓒ C.J. Yoon ALL RIGHTS RESERVED 제 III 부 생산능력.
Advertisements

여성의 광장 어린이 집 www. womankids. com
III. 민족 운동의 전개 1. 일제의 식민지 지배 정책 조선 총독부.
목 차 I 방위산업의 정의 II 방위산업의 특성 III 방위산업의 현황.
홍보출판 위원회 출판국 2010년 사역 계획서 발표자 : 출판국 국장 / 박수만권사 일시: 2010년 01월 17일(일) 1.
경주 3코스 양반문화와 전통 다크호스 백 지연 다크호스 백지연 4학년.
2002년 낙동고 4기 동기회 모임 낙동고 4기 동기회.
개정 배경 추진 경과 학교생활기록부 관련 훈령 개정 내용 학교생활기록부 기재 길라잡이 주요 개정 내용 강조사항 안내 질의·응답.
저출산 고령사회 대응 및 여성 농업인 권익 향상을 위한 정책토론회
역대 정부개편의 교훈과 새로운 정부조직개편의 방향
6장. 멀티스레드 멀티스레드 프로그래밍의 필요성을 이해하고 기본 개념을 익힌다.
김종찬 김정석 이상미 임성규 담당 교수님 최병수 교수님
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 1-1 C 언어의 개론적 이야기 프로그래밍 언어란 무엇인가? 컴파일이란 무엇인가? 사람과 컴파일러가 이해할 수 있는 약속된 형태의 언어 C 언어도 프로그래밍 언어 중 하나이다. 컴파일이란 무엇인가? 프로그래밍.
체위변경과 이동 요양보호 강사 : 이윤희.
이 동 체 심 진천 연수원 순 서 창원 2007년-02월호 2월의 테마 “ 기본충실” 창원권 좌담회 기획지
교동 장독대 마을 회의 2010년 3월 7일.
제13장 기본적인 지형 렌더링 학기 컴퓨터게임(DirectX).
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
DirectX Audio 2002년 3월 최윤석 작성.
스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
컴퓨터 계측 및 실습 스테핑 모터 영남대학교 기계공학부.
문 성 원 3D Game Programming QuadTree Culling 문 성 원 KoreaIT 전문학교 게임학과.
사무실 찾기 PROJECT… 사무실 찾기 사이트 및 효과 보고서 온라인 광고
25장. 메모리 관리와 동적 할당.
Chapter 02. 윈도우 소켓 시작하기.
제 14 장 파티클 시스템.
운영체제 허상복 컴퓨터시스템 연구실
Data structures 02.3:programming recursive functions
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
주소록 프로그램.
스택(Stack) 김진수
QT/Embedded, iPop을 이용한 네트워크 오목게임
QT/Embedded, iPop을 이용한 네트워크 오목게임
모듈 초기화 module_init(hello_init); module_exit(hello_exit);
중화학 공업이 발달한 남동 임해 공업 지역 사회 1학년 1학기
올바른 이메일 사용법
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
나이스 진로정보 초‧중‧고 연계 서비스 안내 (수) 한국교육학술정보원 교육행정부 김지광 선임연구원
ETACS.
물류단지 총량제 폐지 이후 물류시설 공급정책 방향 국 토 교 통 부.
신 윤 호 ㈜엘림에듀 초등사업본부장, 중앙대학교 체육학박사
III. 문화 경관의 다양성 2. 촌락 경관의 유형과 특성 고등학교 사회
수학8가 대한 92~95 쪽 Ⅳ. 연립방정식 1. 연립방정식과 그 풀이 및 활용 >끝내기전에(9/9) 끝내기 전에.
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
서비스 액세스 매니지먼트 툴 투어: 계약 번호 2009년 9월.
연립방정식 활용 수학8가 대한 87~89 쪽 Ⅳ. 연립방정식
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
자바 5.0 프로그래밍.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
DirectSound 프로그래밍 DirectSound를 사용하면 매우 짧은 지연 시간에 사운드를 재생해, 애플리케이션으로 하드웨어 리소스를 치밀하게 제어할 수 있다. DirectSound 인터페이스를 사용하여 다음과 같은 처리가 가능하게 된다. WAV 포맷의 파일 또는.
지적재조사 홍보컨텐츠 개발현황 브랜드 네임 심볼마크 슬로건.
학습지도안 단원명 대단원 III유전과 진화 중단원:1.세포분열 소단원 (1)체세포분열 작성자 신동명.
서비스 액세스 매니지먼트 툴 투어 Bill to ID 와 계약번호
18장. 다차원 배열 그리고 포인터.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
C# 10장. 참조형.
셀 교회란 무엇인가?.
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
교육기부 진로체험기관 인증제와 지역 센터 운영 방안 한국직업능력개발원 김승보.
수학8가 대한 92~95 쪽 Ⅳ. 연립방정식 1. 연립방정식과 그 풀이 및 활용 >끝내기전에(9/9) 끝내기 전에.
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
제9주 예산 수립과 집행.
양초 한 자루의 과학 과학영재교육 전공 김 연 주 류 은 희 이 상 희.
오늘은 주님 수난 성금요일입니다..
argc, argv 의 사용방법 #include <stdio.h>
초파리.
DirectX 9 Ch1. Direct3D 초기화.
C.
농업과 공업의 입지[2] 사 회 1학년 III. 생활 공간의 형성과 변화> 1. 장소의 인식과 입지 결정[3/10] 수업
Presentation transcript:

1.비디오 메모리 잠그기 2.화면에 픽셀찍기 학습목표 이번절에서는 평면을 만든후에 평면을 잠그고 평면에 데이타값을 복사해 넣어서 정확한 위치에 픽셀을 찍는원리와 프로그램코드를 공부해보기로하겟읍니다 픽셀은 선으로이어지고 선은 면으로 이어지니 기초를 충실히 딱아야하겟읍니다

첫번째 예제 – 화면에 픽셀찍기 모니터의 마지막 줄은 비디오 메모리상에 며번째 바이트인가???????? 640*480 8비트모드의 스크린 화면에 어떤점을 찍을려면 디스플레이모드가 해상도 640*480 이고칼라 뎁스가 8비트로로 셋팅되어져 있다고 가정한다고 팔레트를 사용하지 않는다면 먼저 화면에 관계되는 비디오 메모리의 첫번째 포인터를 얻어야한다 그리고 한바이트안에 래드 ,그린, 블루 값들을 각각 세팅해 넣어야하고 원하는 곳에 이점을 디스플레이하기위해서는 화면상에 한라인에 소요되는 비디오 메모리의 피치를 알아야한다 왜냐면 비디오 메모리리는 연속적인 메모리 구조를 가지기 때문이다 위그림과 같이 연속적인 메모리구조를 선형구조를 가진다고 이야기한는데 모니터의 한줄을 찍을려면 비디오메모리상에는 몇바이트를 소모하는지 알아야 다음줄을 찍을수 잇기 때문이다

Game_Init() { LPDIRECTDRAW lpDD; if(FAILED(DirectDrawCreate(NULL,&lpDD,NULL))) return (0); if(FAILED(lpDD->QueryInterface(IID_IDirectDraw4,(LPVOID *)&lpdd4))) return (0); lpDD->Release(); if(FAILED(lpdd4->SetCooperativeLevel(m_hWnd, DDSCL_EXCLUSIVE| DDSCL_FULLSCREENDDSCL_ALLOWMODEX|DDSCL_ALLOWREBOOT))) return (0); if (FAILED(lpdd4->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0))) return(0); DDSURFACEDESC2 ddsd; DRAW_INIT_STRUCT(ddsd); //표면 구조체 초기화와 만들 표면 묘사 ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if(FAILED(lpdd4->CreateSurface(&ddsd,&lpddsprimary,NULL))) return (0); return 1; } 전반적인 코딩의 흐름 위의 그림과 같은 전반적인 흐름을 이해하면서 코딩을 분석하자 Game_Init() 에서하는일은 전반적인게임루틴에서팔요한 다이렉트 드로우객체를 만들고 윈도우 레벨을 전체화면으로할것인지그렇지 않을것인지 설정하는부분과 디스플레이 모드설정부분 그리고 DDSURFACEDESC2구조체를 이용한 주평면의 생성하는부분이 Game_Init() 에서 하는일이다 LPDIRECTDRAW4 lpdd4; LPDIRECTDRAWSURFACE4 lpddsprimary; LPDIRECTDRAWPALETTE lpddpal ;

Int Game_Main() { DDSURFACEDESC2 ddsd; DDRAW_INIT_STRUCT(ddsd); if(FAILED(pddsprimary->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL))) return 0; int lpitch16=(int)(ddsd.lPitch>>1); USHORT*video_buffer=(USHORT*)ddsd.lpSurface; int Red,Blue,Green,x,y; for(int i=0;i<1000;i++) { Red=rand()%255; Blue=rand()%255; Green=rand()%255; x=rand()%640; y=rand()%480; Plot_Pixel_Faster16(x,y,Red,Blue,Green,video_buffer,lpitch16); } if(FAILED(lpddsprimary->Unlock(NULL))) return 0; return 1; Game_Main()함수에서하는일은 주평면을 잠궈서 주평면의 첫번째 포인터를 얻은후 픽셀을 찍을 색을 랜덤하게 설정한후 주평면으 첫번째 포인터와 함깨 랜덤한 색을 Plot_Pixel_Faster16()함수의 인자를 통해 건네주는 역할을한다

비디오 메모리 잠그기 HRESULT Lock( LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent ); 첫번째 인자는 잠귈 영역을 표시한다 만일 NULL이면 전체 화면에 대해 잠근다 두번째인자는 DDSURFACEDES2 구조체 포인터 로서 잠그는 평면 정보를 이 구조체에 복사한다 세번째 인자는 컨트롤 플래그로서 아래 표에 있는 값을 준다 네번째 인자는 확장기능을 대비한것으로 NULL값을 대입한다 주 평면의 비디오 메로리에 직접 접근하기 위해서는 Lock()함수를 이용한다 이 함수의 첫번째 인자는 잠귈 영역을 표시한다 만일 NULL이면 전체 화면에 대해 잠근다 두번째인자는 DDSURFACEDES2 구조체 포인터 로서 잠그는 폄면 정보를 이 구조체에 복사한다 세번째 인자는 컨트롤 플래그로서 아래 표에 있는 값을 준다 네번째 인자는 확장기능을 대비한것으로 NULL값을 대입한다 그림과 같이 주평면을 잠그면 구조체의 인자pSurface멤버에 이비디오 메모리의 첫번째 포인터를 알으켜 주므로 이것을 가지고 일반 메모리다루듯이 데이터를 읽어올수도 있고 복사할수도 있다 주의 할것은 데이터를 다룬후 반드시 UnLock()함수를 호출해 모니터로 다시그릴수있게 해주어야한다 DDSURFACEDESC2 ddsd; DDRAW_INIT_STRUCT(ddsd); if(FAILED(pddsprimary->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL))) return 0; USHORT*video_buffer=(USHORT*)ddsd.lpSurface;

화면에 픽셀찍기(계속) 화면에 점을 원하는곳에 표현하기위해서는 1,디스플레이모드를 알아야한다 즉 픽셀당 먗바이트를 쓰고 있는지알아야한다 2 주평면의 첫번째 포인터에 접근해야한다Lock(),InLock() 3 한라인을 찍기위해 비디오 메모리상에 몇바이트를 쓰는지 알아야한다 밑에 그림은 간단한 모니터를 표현한것이다 모니터는 디스플레이 모드가 10*10 /8비트모드 로 설정되어있다고 가정하고 주평면을 만들면 피치는 한라인을찍기위한 비디오 메모리의 바이트수를 의미하니 피치=10이 될것이다 그럼 이비디오 메모리의 첫번째 포인터를 Lock()함수를 이용해얻었다면 Lock()함수는 void*형을 리턴하기 때문에 알맞은 형으로 타입캐스트하여 사용하면 될것이다 따라서 모니터 좌표 X=2,Y=0에 해당하는 비디오 메모리의 배열형은 (char*)pa[2]가될것이다

화면에 픽셀찍기(계속) 다음과 같이 디스플레이 모드가 5*5 /16비트모드 와 같다면 위의그림과 같이 될것이다 그럼X=1,Y=2의 빨간점의 실제 비디오 메모리는 어디에 위치할까 이 계산은 위의 공식처럼 행하면 되겟다 실제 비디로 메모리 포인터를 (ushort*)으로 타입캐스트하면 배열로 표현하면 11번째 배열이다 그럼 모니터 좌표만으로 11번째 배열을 어떻게 알아낼까 pa[X+Y*(피치/2)]과 같은 공식을 이용해서 알아내면 쉽게 메모리 좌표를 얻을수 있다

16 비트 칼라값을 위한 매크로 8 비트 모드일때 픽셀 찍기 16 비트 칼라값을 위한 매크로 는 위와 같이 정의 하여 매크로 함수로 만들어 놓으면 편리하다 그리고 Game_Main() 마지막줄에 호츨되는 Plot_Pixel_Faster16()함수는 8비트 모드일때 그리고 16 비트 모드일때 함수의 인자를 달리하여 비디오메모리의 원하는 곳에 픽셀 값을 입히면 되겟다 16 비트 모드일때 픽셀찍기

프로그램 실행 프로그램을 실행하면 다음과 같이 풀화면으로 출력되고 픽셀칼라값이 랜덤하게 찍히는것을 볼수 있다 그리고 프로그램을 실행하면 다음과 같이 풀화면으로 출력되고 픽셀칼라값이 랜덤하게 찍히는것을 볼수 있다 그리고 윈도우 스타일을 팝업윈도우스타일로 바꾼다 화면윈도우가 풀화면으로 출력되는동시에 다이렉트X프로그램이 실행이된다 물론 이것을 꼭 이렇게 바꿀 필요는없지만 잠시나마 이렇게 안하면 작은윈도우가 보이고 풀화면이 뜨기때문에 눈에 거슬리는것을 방지하기 위해서이다 윈도우 스타일을 팝업윈도우스타일로 바꾼다 화면윈도우가 풀화면으로 출력되는동시에 다이렉트X프로그램이 실행이된다 물론 이것을 꼭 이렇게 바꿀 필요는없지만 잠시나마 이렇게 안하면 작은윈도우가 보이고 풀화면이 뜨기때문에 눈에 거슬리는것을 방지하기 위해서이다

다이렉트 드로우 인터페이스 해제 마지막으로 해야할일은 다이렉트 드로우 인터페이스 해제인데 해당인터페이스의 Release()함수를 호츨해주므로서 COM을 쓰지 않는다는것을 알린다

단원요약 1 픽셀을 화면에 찍기위해서는 우선 주 평면을 만들고 이주평면에 데이터를 복사하기위해 평면을 잠그는함수인 Lock()함수를 이용한다 2. 평면의 정보를 알아내기위해 Lock()함수는 DDSURFACEDESC 구조체를 이용한다

평가 1 표면에 데이터를 복사하기위해 사용되어지는함수는 ? 2LOCK()함수는 어떤구조체를 이용하여 표면의 정보를 알아내는가?

답안 1.Lock()함수 2. DDSURFACEDESC 구조체