지난번 8800gt에 이어 이번엔 4870 toxic vapor-X을 맥프로용으로 롬플래싱 해본다.

8800gt는 레퍼런스였지만, 이번 4870은 비레퍼런스이다.

사파이어에서 레퍼런스대비 발열과 소음을 줄인 프리미엄모델로 출시한 녀석...

게다가 맥프로용으로 출시된 4870은 VRAM이 512MB인데 반해,

4870 toxic vapor-x는 VRAM이 1G이다.

다행히 방열판의 방향이 PCI-E슬롯과 평행하기 때문에 맥프로의 공기흐름과 잘 맞아떨어지는 녀석

기본예의상 중고4870을 아주아주 깨끗하게 닦고,

써멀까지 MX-4로 새로 도포해줬다 ^^;;



1. USB부팅디스크 만들기

 - 지난번 8800gt에서 했던 USB만들기(http://nagarry.tistory.com/162)와 동일하게 준비해야한다.

 - 위 링크에서 2개의 파일(DOS.zip, SP27608.exe)을 받아서 따라하면된다



2. 롬플래싱 파일과 바이오스 준비

 - 8800gt는 Nvidia였고, 4870은 ATI이기때문에 사용하는 롬플래싱 어플과 바이오스가 다르다.

 - 아래에 파일 3개를 사용하겠다.

 - USB부팅디스크안에 넣어준다.

atiflash.exe

atiflash.chg

efi4870GB.rom



3. 롬플래싱

 - PC에 4870을 꽂고, 준비한 USB로 부팅한다.

 - DOS명령줄에서 "atiflash -p -fs -fp 0 efi4870gb.rom"을 타이핑

 - 약 3~4초 후에 완료했다는 메세지가 뜬다.



4. 맥프로에 꽂기

 - 기존에 있던 그래픽카드를 뽑고,

 - 4870으로 교체한후 6핀 보조전원 2개를 다 꽂아준다.



5. 맥프로 부팅

 - 애플부팅로고가 뜬다면 모든게 완벽하게 되었다는 것!!!



6. 시스템정보 확인



7. 끝~!



이제 겁나게 사용하면 된다!!!!

Google AdSense

오늘은 직접 PC용으로 출시된 8800gt를 맥용으로 롬플래싱해보겠다!!

(맥용이래봤자 적용되는 제품군은 맥프로뿐....)


일반 PC용으로 나온 장비와 맥용으로 나온 장비의 가격차는 어마어마하다.

그 차이가 어마어마한 이유는....

일반PC용 장비는 출시후 시간이 지나면서 가격이 점점 떨어지기 마련인데,

맥용 장비는 출시때도 비싸게 출시되지만, 애플이 그 가격을 쭉 유지해버리기 때문이다.


그런데, PC용 하드웨어가 맥과 동일하다면...

굳이 비싼 맥용 하드웨어를 구매할 필요가 있을까?


ROM Flashing(롬플래싱)이란?

그래픽카드와 같은 하드웨어장치속에는 ROM이라는 기록가능한 저장장치가 있다.

일반적으로 제조사에서 내용이 삽입되면 더이상 수정할 일이 없지만,

엄연히 읽기/쓰기가 가능한 저장장치이기에 다른 ROM을 덮어쓸 수 있다.

이것을 롬플래싱이라고 한다.


그래픽카드 또한 일반PC와 맥용의 가격이 어마어마한 차이를 보인다.

하지만, 정작 그 그래픽칩셋을 만드는 AMD, NVIDA는 PC/맥 장비를 따로 만들지 않는다.

동일한 그래픽카드이지만, 그 속의 저장장치인 롬의 내용만 다를 뿐이다.


결국 그래픽칩셋 제조사가 직접 만드는 레퍼런스 모델은 하드웨어적으로 PC와 맥이 완전히 동일하기에

롬만 서로의 것으로 바꿔주면 완전하게 변신할 수 있다는 얘기이다.


왼쪽이 맥프로용 8800gt, 오른쪽이 PC용 8800gt(레퍼런스)인데...

 

 

외관만 동일한게 아니라 내부 하드웨어 역시 완벽하게 동일하다.


그리고 이것이 내가 가진 8800gt이다.

그렇다. 내가 가진 8800gt는 레퍼런스 모델이다.


혹여 외부쿨러의 모양이 이와 다를지라도....

쿨러를 분리한 내부 모습이 아래와 같다면, 그것 또한 레퍼런스 모델이다.

(엄연히 말하자면 레퍼런스카드에서 쿨러만 교채한 모델)

그래픽카드 오른쪽에 위치한 전원부 구성을 특히 잘 보시라.

레퍼런스기판이 아니라면 필시 전원부 구성이 다를것이다.



자 그럼 레퍼런스 8800gt가 있으므로, 롬플래싱 작업을 할 USB메모리 하나만 준비하면 된다.

아래의 5개 파일로 USB메모리를 준비시킬 것이다.


DOS.zip

mp8800gt.rom

M88GT32.ROM

nvflash_5.95.0.1.zip

SP27608.exe


1. SP27608.exe를 PC에 설치

 - HP USB StorageTool이라는 건데, USB메모리를 PC용 부팅DOS로 만들어준다.


2. USB DOS만들기

 - HP USB StorageTool 실행

 - DOS.zip 압축을 풀어준다

 - 아래와 DOS압축속 Sys폴더를 지정(난 DOS를 바탕화면에 풀었음)


3. nvflash_5.95.0.1.zip, mp8800gt.rom

 - zip의 압축을 풀어서 그 내용 파일3개를 위에서 만든 USB에 넣어준다.

 - mp8800gt.rom, m88gt32.rom 역시 위에서 만든 USB에 넣어준다.

   * mp8800gt.rom, m88gt32.rom 둘 중 하나를 인식할 것이다.

   * 내 맥프로 1세대(2006년)는 m88gt32.rom을 인식했다)

 - 이로써 롬플래싱용 USB DOS작업은 끝!!


4. USB로 부팅


5. 그래픽 롬용량 체크

 - "nvflash -check" 명령 수행

 - 아래와 같이 롬크가 1024k라고 나오면 가능

 - 레퍼런스는 여지없이 1024k

 * 간혹 비레퍼런스일지라도 1024k이라서 변신성공했다 하는데, 먹통된 경우가 더 많은듯 하다.


6. 롬플래싱 Go Go!!

 - "nvflash -4 -5 -6 mp8800gt.rom" 명령수행

 - 아래와 같이 3번 yes/no 확인을 한다.






7. 완료

 - 맥프로에 꽂아서 사용하면 된다 ㅎㅎㅎㅎ

Google AdSense

HTML5 Canvas에서 이미지를 표시하는걸 알아보겠다.

이미지API에서 허를 찌르는 요소가 있는데, 잘 보길 바란다.

 

 

여기서 쓰일 이미지는 아래의 이미지이다.

 

<64x64이미지가 4장 붙어 있는 이미지. 출처-http://opengameart.org>

 

 

1. 이미지 처리 기본

  canvas의 이미지뿌리는 API는 drawImage()이다.

 

Javascript를 통해 Canvas에서 이미지 정보를 읽어들이는 부분을 작성해보자

var canvas1 = document.getElementById("CANVAS_1");

var context1 = canvas1.getContext("2d"); 

var catImage = new Image();

 

catImage.src = "https://t1.daumcdn.net/cfile/tistory/25679E435319402A2B";

catImage라는 변수에 Image를 생성해서 넣고,

catImage.src를 통해 그림의 위치를 지정해 넣었다.

 

이제 그림이 성공적으로 로딩되면,

그 그림을 뿌리는 부분을 작성해보자

catImage.addEventListener('load', eventCatImageLoaded, false);

function eventCatImageLoaded()

{

    context1.drawImage(catImage, 0, 0);

}

catImage에 load이벤트를 걸었다.

load가되면 eventCatImageLoaded()라는 함수를 호출하게 했고,

함수안에선 캔버스 컨텍스트에 이미지 좌표 0,0에 그리게 했다.

 

 

2. 이미지 확대/축소

 앞에서 사용했던 drawImage()함수에 가로, 세로 인자를 추가하면 이미지를 확대/축소할 수 있다. 

 

 

 

3. 이미지 자르기

 앞에서 사용했던 drawImage()함수에 이미지 자르는 지점을 추가하면 이미지를 자르고, 확대/축소할 수 있다.

다만, 인자값의 순서를 조심하라!!! 진짜 허를 찌르는 인자구성이다.

 

 

 

다음 포스트에서는 이미지자르기와 setInterval()을 이용한 기본적인 sprite기능을 알아보겠다.

.... 라고 했지만, 2015년 2월 11일 현재, 글쓰기 귀찮아짐.

이전 포스트의 index.html파일을 다운받아서 소스를 보면 됨


 

 

Google AdSense

HTML5 Canvas에서 이미지 뿌리기기와 타이머를 이용한 스프라이트 출력을 해보겠다.





아래의 sprite sheet를 가지고 직접 이 페이지에 움직이는 스프라이트를 구현해보겠다.


<이미지 출처 - http://ancientbeast.com/viewer/>


만약 아래에 "Sorry, Your browser doesn't support HTML5 Canvas."라는 문구가 보인다면 브라우저가 구형인 것이다.

한국인 대부분이 사용하는 익스플로어는 9버젼부터 Canvas를 지원하고,

10버젼부터 비로소 본격적으로 HTML5를 지원한다.

따라서 HTML5를 공부하고 싶은 사람이라면 10이상을 쓰던가, 아예 크롬을 설치해서 쓰길 바란다.

Sorry, Your browser doesn't support HTML5 Canvas.

위의 움직이는 이미지가 잘보이는가?

위는 실제로 이 페이지안에 canvas와 javascript를 이용하여 구현한 것이다.

아래의 index.html소스를 통해 어떻게 구현했는지 확인하길 바란다.

Index.html



자세한 설명은 다음 포스팅을 통해 하겠다.

원래는 이번 포스트에서 자세한 설명을 하려고 하였으나....

티스토리 글쓰기를 통해 이미지를 등록하고,
그 이미즈를 이용해서 canvas와 javascript를 구현하자니, 글을 몇번이나 날려먹는 실수를 저질렀다.
'하~ 힘빠져...'




Google AdSense

지난번 포스트에서 canvas를 제어하는 javascript는 <canvas>태그 이후 정의해야만 했었다.
오늘은 정의위치와 상관없이 짜는 방법을 찾아보겠다.

아울러 이 방법은 javascript를 통한 canvas 캡슐화의 한 방법이기도 하니 알아두면 좋을 것이다.

(javascript에서 함수는 객체, var는 private으로 취급된다는걸 염두하면 당연한 일이다)



우선 지난번 만들었던 index.html과 javascript이다.

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

<script src="./script/Nagarry.js"></script>

</body>

</html>


Nagarry.js

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);


canvas이후에 javascript가 위치한다.

javascript에서 canvas를 사용하므로, canvas가 정의된 이후에 javascript를 써야했던 것이다.


이걸 이렇게 고쳐보겠다.

우선 javascript 정의를 <canvas>훨씬 전인 <head>내부에 위치시켰고,

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

<script src="./script/Nagarry.js"></script>

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

</body>

</html>



javascript도 이렇게 바꾸겠다.

Nagarry.js

window.addEventListener("load", eventWindowLoaded, false);


function eventWindowLoaded()

{

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);

}


index.html은 javascript정의 순서만 바뀌었는데,

javascript는 뭔가 바뀌었다.

바로 이녀석이 핵심이다.

window.addEventListener("load", eventWindowLoaded, false);


여기서 window란 윈도xp나 윈도7같은 OS가 아니고, DOM(Document Object Model)객체의 최상위 객체다.

window가 최상위 객체다보니 사실은 window.document.getElementById("CANVAS_1");이라도 해도 무방하나,

window는 보통 생략하고, 위 소스와 같이 document.getElementById("CANVAS_1");라고만한다.

이것을 window.addEventListener("load", eventWindowLoaded, false);에 적용시켜보면,

addEventListener("load", eventWindowLoaded, false);이라고 작성해도 무방하다는 말이다.

실제로 브라우저들은 아무문제없이 이를 처리한다.




<window는 DOM최상위 객체- http://www.w3.org/TR/DOM-Level-3-Events/>



결국 DOM최상의 레벨인 만큼 window는 html페이지 전체를 의미하고,

결국 html페이지를 의미하는 window으로부터 addEventListener()라는 것을 호출했다.


addEventListener()는 이벤트큐에 함수를 추가하는 기능을 하고 3개의 인자를 가진다.

첫째인자는 이벤트인데, window의 이벤트는 이미 다 정의되어 있기에 여기선 html페이지가 모두 로딩되면

호출되는 "load"를 사용했다.

(참고 : http://www.w3.org/TR/DOM-Level-3-Events/)

두번째 인자는 함수명이다. 이벤트가 발생하면 호출되는 함수인데, 여기선 html페이지가 load되면 eventWindowLoaded()라는 함수를 호출하게 된다.

셋째 인자는 useCapture이다. DOM하위로 이벤트를 보낸건지 말건지 결정한다.

여기선 false이므로 더이상 하위로 보내지않는다.


셋째인자인 useCapture와 상관없이 프로그램을 짜려면

window.addEventListener("load", eventWindowLoaded, false);

부분을 다르게 바꿀 수 있다. window.[on이벤트]라는 방식이다.


이렇게 말이다.

window.onload = function()

{

eventWindowLoaded();

}

이건 다시 한줄로 이렇게 표한할 수도 있다.

window.onload = eventWindowLoaded();


아지만 나는 .NET프로그램을 짜던 내 습관과 가장 유사한 이 방식이 가장 내 맘에 든다.

window.addEventListener("load", eventWindowLoaded, false);// 이게 잘 맘에 듬

(물론 형태에 따라 저장후 호출되는 함수이냐 즉시실행함수이냐 등의 차이는 있으나, 아직은 무시하자)


다시 말하면 결국 이 코드는...

Nagarry.js

window.addEventListener("load", eventWindowLoaded, false);


function eventWindowLoaded()

{

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);

}


html페이지가 모두 로딩되면,

eventWindowLoaded()라는 함수를 호출하게 되고,

그 함수안에서 canvas와 context를 사용하게 되는 것이다.


이렇게 canvas변수를 이벤트 함수안에 넣어 캡슐화하면, 혹시나 모를 다른 변수나 함수와의 충돌을 피할 수 있다.

Google AdSense

'끄적끄적 > HTML5' 카테고리의 다른 글

HTML5 Canvas 이미지 처리  (1) 2014.03.07
HTML5 Canvas 이미지/스프라이트  (2) 2014.03.06
HTML5 개발툴 끝판왕(?) - Liveweave  (2) 2014.03.02
[HTML5] Javascript로 canvas제어하기  (0) 2014.03.01
HTML5 시작하기  (0) 2014.03.01

+ Recent posts