블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2809)
Unity3D (865)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

이번 프로젝트에 무료 라이브러리를 하나 추가했는데, 이 녀석이 소스는 공개를 안하고 있는 녀석이었습니다. 현업에서 검증도 안되고 소스를 깔 수도 없는 라이브러리를 사용한 저에게 원죄가 있지만 이 녀석이 워낙에 타의 추종을 불허하는 강력한 녀석인지라 마약인지 알고서도 손을 데고야 말았습니다.

이제까지 잘 쓰고 있었는데, 최근 제품이 출시되면서 하드한 상황에서 프로그램이 돌다 보니 이 라이브러리 안에서 프로그램이 뻗는다는 것을 알게 되었습죠. 당황스러웠지만 별거 아니라고 생각하고 원작자와 몇 차례 메일을 주고 받았습니다. 하지만 생각처럼 쉽게 상황이 해결되지 않더군요.

아는 분들은 아시겠지만 이런 상황을 포함한 여러 상황에서 디버깅을 할 수 있는 방법이 있습니다. 마이크로소프트의 오류보고가 그것이죠. minidump 라고 해서 IE 5.0 이상 시절부터 추가되었다고 하더군요. 아주 심플하게 설명 드리면 디버그 모드로 실행하고 브레이크 포인트 하나 걸고 세운 다음에 메뉴 > 디버그 에 save dump 를 선택하시고 잘 저장하시면 됩니다. 이제 솔루션을 닫고 메뉴 > Open > solution 에서 저장한 .dmp(dump 파일) 을 불러주세요. F5 를 눌러서 실행해 보시면 좀 전에 멈췄던 상황을 보여줄 것입니다.

이때 좀 더 상황을 디테일하게 보고 싶은 라이브러리가 있는 경우 라이브러리와 디버그 정보(DBG 혹은 PDB 파일) 을 엮어 주시면 안에를 까볼 수 있습니다.

저의 상황에서 제가 덤프를 라이브러리 원작자 분께 넘겨 드리면 그 분은 본인은 소스가 있을 테니까 본인의 pdb 파일을 엮어서 안에 상황을 적나라하게 확인해 볼 수가 있겠죠.

아래는 제가 번역한 문서인데, 번역이 좋지 않으니 그냥 원문을 보시는 것이; 좋을 것 같습니다. 내용은 별거 아닌데 상황에 따라서 꽤나 유용하겠다 싶어 올려봅니다.

http://aronze.egloos.com/1432450#1432450_1

좋은하루 되세요.

반응형
Posted by blueasa
, |

Notepad++배우기

Tip & Tech / 2011. 7. 30. 08:25

한글 웹에디터인 노트패드 로 HTML 편집을 할려고 합니다.

내려받기 사이트는

http://notepad-plus-plus.org/

입니다.

 

1.제일먼저 익스플로러에서 보려면 ctrl+alt+shift+I 입니다.

2.문장 뒷 공백 삭제: 긁어온 문장의 뒷 공백을 삭제할 때

편집 > 줄 끝 공백제거(TextFX > TextFx Edit > Trim Trailing Spaces)

2. merge: 여러 줄을 하나의 줄로 합친다.

합칠 줄 선택 > 편집 > 줄 합치기(Ctrl + J)

3.특정 구분자로 줄 나누기: 컴마(,) 혹은 | 와 같은 특정 구분자로 하나의 긴 문장을 여러 문장으로 분할함.

구분자를 clip board copy(Ctrl+C) > TextFX > TextFX Edit > Split lines at ...

4. 두개의 text 문서 비교하기: Diff

플러그인 > Compare > Compare . 작업 후 플러그인 > Compare > Clear Results

5.URI Encoding:

변환할 text 선택 > TextFX > TextFx Convert > Encode URI Component

6.컬럼 모드: row 가 아닌 column 작업을 할 때: 기존 드래그 동작에 alt 추가

Alt + 마우스 드래그 혹은 Alt + Shift + 커서 (Alt + C)

7.창 분할: 2개까지만 분할.

분할하기: 상단 문서명 tab 에 우클릭 > 분할 창으로 이동

분할 모드 변경(가로/세로): 분할 bar 에 우클릭 > Rotate to Right / Rotate to Left

8.정규식(Regular Expression) 사용하여 찾기/변환: Ctrl + H 단축키를 사용하여 창을 띄우고, 찾기방식 중 정규표현식을 선택

열려진 모든 파일에서 찾고 모두 바꾸기: 일일이 파일 찾아다니면서 할 필요 없이 열어놓은 상태에서 한번에 이 기능을 사용할 경우 작업 깔끔해짐.

정규식 사용: 꽤나 빡빡하게 적용한다. 전체 문자열 맨 뒤에 abc 를 추가로 붙이고 싶다면 ^(.*)$ \1abc 로 바꾸면 된다.

9.단축키

새파일 : Ctrl+N

빠른찾기(위로):ctrl + shift + ↑

빠른찾기(아래로): ctrl + shift + ↓

상위의 행과 바꾸기:ctrl + alt + ↑

하위의 행과 바꾸기:ctrl + alt + ↓

열기 : Ctrl+O

저장 : Ctrl+S

다른이름으로 저장 : Ctrl+Alt+S

모두 저장 : Ctrl+Shift+S

닫기 : Ctrl+W

인쇄 : Ctrl+P

종료 : Alt+F4

줄 나누기 : Ctrl+I

줄 합치기 : Ctrl+J

현재줄 위로 이동 : Ctrl+Shift+Up

현재줄 아래로 이동 : Ctrl+Shift+Down

열 편집기 : Alt+C

익스플로러에서보기 ctrl+alt+shift+i

기타단축키: 메뉴> 설정 > 단축키 설정

<응용>

1 Notepad++에서 URL 입력시 자동으로 하이퍼 링크가 생성이 되지 않게 하려면: 메뉴중 설정> 환경 설정> MISC 탭으로 이동을 합니다. 우측 상단에 클릭 가능한 링크 설정이라는 부분이 있는데, 여기에 사용에 체크가 되어 있습니다. 체크를 해제해 준 다음에 닫기 버튼을 클릭하고 URL을 입력하면 자동으로 링크가 생성이 되지 않고 일반 텍스트처럼 URL을 입력할 수 있슴

2. 아이콘을 숨길 수 있는 옵션(작업창 상단의 도구모음 아이콘이 화면에서 사라지고 기본 메뉴만표시): 메뉴에서 환경 설정> 도구모음>환경 설정 창의 전체 탭:도구 모음에 대한 옵션>숨기라는 부분앞에 체크> 닫기 버튼 응용

3.Notepad 정규표현식의 문법

일반 문자열의 매치와 변형까지 함께 찾음.

*참고로 백슬래시는 한글로 인코딩된 페이지에서는 \(원화표시)

^ : 행의 시작

^\d.+

[] : 포함된 문자들 중 하나와 매치하는 문자

[abc]= a, b, c 중의 한 글자

[a-z]와 같이 하이픈을 넣어서 범위 전체를 지정.

[0-9]라고 적으면 한 글자의 숫자를 뜻합니다.

[^abc] : []속에 들어간 ^표시는 이 대괄호에 포함된 글씨는 제외

S[^cde]m 이라는 정규식은 Sam, Sbm은 매치하지만 Scm, Sdm은 매치하지 않음

$ : 행의 끝

숫자로 끝나는 행: ^.+[0-9]$와 같이 표현

. : 마침표는 임의의 한 글자

+ :어떤 문자 뒤에 붙어서 해당하는 문자가 1개 이상, 여러 개

\d+라고 하면 1, 123141, 2513452345234등 길이에 무관하게 연속된 숫자를 찾습니다.

* : 문자 뒤에 붙어서 그 문자가 0개 이상(참고:+는 그 문자가 반드시 한번은 나옴)

sa+m sam, saam, saaaaaam에 매치, sm에는 매치되지 않듬. 하지만 sa*m sm에도 매치

\d : 한 글자의 숫자를 말합니다. (digit) [0-9]와 같습니다.

\w : 한 글자의 문자를 말합니다. [a-zA-Z]와 같습니다.

\s : 한 칸의 공백을 의미합니다.

\ : 백 슬래쉬는 이스케이프 문자 즉 ^, [, .과 같은 특수한 의미를 가지는 문자

\[abc\]: a,b,c 중의 한 글자가 아닌 [abc] 자체에 매치됩니다.

-이외 홈페이지(영문) 참고-

<예제>

콘솔박스를 통해 수집된 로그를 (어디서부터 받은 로그인지는 비밀) 토대로 메모리 사용량에 대한 정보를 추출

사실 콘솔 박스로부터 수집되는 정보는 상당히 다양하지만 메모리 정보를 담고 있는 부분은 아래와 같은 형식으로 되어 있습니다.

[21:44:07 Oct 12 Fri] @0x3924004E|JVM| Free Memory: Heap [ 2368340/ 6291456], Native[ 7299824/32505856]

우선 로그파일 전체를 notepad++로 불러들어와서 찾기(ctrl+F)를 실행

우리는 위와 같은행을 모두 찾아서 추출

통상 ‘Free Memory:’ 로 검색: 종종 중간에 정보가 끊어지고 2행에 걸쳐 깨진 채로 정보가 남음

-> heap native 정보를 모두 포함하고숫자]’로 끝나는 행

heap.+native.+\d]$

아래 스크린샷과 같이정규표현식에 체크를 해주고 위의 정규식을 입력한 다음, ‘열려진 파일에서 모두 찾기버튼을 클릭합니다. 버튼을 클릭하면 notepad++아래쪽으로 분할창이 생성되며 해당하는 행들이 모두 찾아집니다.

그럼 새 파일을 하나 만들고, 아래의 내용을 모두 선택(Ctrl+A)하여 새 파일에 붙여 넣습니다.

정규표현식의 패턴

‘Tom Smith’->“Smith, Tom”가 많을 때:

1.텍스트 파일을 엑셀로 불러들여서 공백으로 나누어 바꿈

2.패턴을 사용: 패턴이 되는 부분을 () 괄호로 묶은 다음, 바꿀 단어에서 \1, \2와 같이 나온 순서대로 써줌.

Line 394 : [21:44:07 Oct 12 Fri] @0x3924004E|JVM| Free Memory: Heap [ 2368340/ 6291456], Native[ 7299824/32505856]

위와 같은 로그 정보는 다음과 같이 풀이됩니다.

1.라인넘버가 표시됩니다.L로 시작됩니다.

2.타임스탬프는 [ 대괄호로 시작됩니다.

3.3쌍의 숫자가 콜론(:)으로 구분되어 시간을 표시합니다.

4.날짜와 요일이 표시되고 ]로 대괄호가 닫힙니다.

5.제거되어야할 문자열들이 이어지고

6.Heap 이라는 단어 다음에

7.[로 시작되며 남은 heap 메모리량과 슬래시(/)가 붙어 전체 heap 메모리량을 표시 * 숫자의 길이에 따라 공백이 있을 수 있슴

8.heap 메모리 정보는 ]로 끝나며 이후 native 메모리 정보가 같은 형식으로 표시

^L.+\[(\d\d:\d\d:\d\d).+\[([\s\d]+)/([\s\d]+)].+\[([\s\d]+)/([\s\d]+)]$

1. 괄호로 묶은 부분은 순서대로 (타임스탬프),(heap),(total heap),(native),(total native) 즉 순서대로 \1,\2,\3,\4,\5가 됨. 임의의 구분자 |(액셀에서 쉽게)를 사용->바꿀 단어는 \1|\2|\3|\4|\5

2. 찾을 단어와 바꿀 단어에 위에서 작성한 정규식을 넣어주고

3. 정규표현식에 체크한 상태에서모두바꾸기를 클릭

4. 필요한 정보만 남은 창

5. 텍스트 파일로 저장

6. |로 구분하여 셀을 분리

7. 깔끔하게 그래프를 그림.

 

<사용법으로 체계화된 한글매뉴얼은 아직 없는 것 같아

나름대로 정리해 보았습니다. 조금이라도 이해에 도음이 되었으면 합니다.>


출처 :  http://cafe.naver.com/iparkub/1325

반응형
Posted by blueasa
, |
로그 메씨지 & 메씨지박스출력
NiMessageBox::DisplayMessage("MOUT::CreateScene -- W../res/data/script/model.xm Loading script Failed","script error");
본 & 스키닝 구조정리
- NiSkiningInstance
NiAVObject *const* GetBones() : 본의 포인터배열 얻기
본도 오브잭트로 여긴다. 위치정보를가진 일종에 더미로 여긴다.노드와 비슷하나 자식을가지지는 못하는..
그러나 여기서 본의 갯수는알수가없다.
그래서...
이런식으로 스킨데이터를얻어온다.
NiSkinData* pkOldSkinData = spOldSkinInstance->GetSkinData();
- NiSkinData
스킨데이터에서 본의 갯수를알수있다.
pkOldSkinData->GetBoneCount()
본의 정점 링크정보를 얻기
NiSkinData::BoneData* pkOldBoneData = pkOldSkinData->GetBoneData();
본데이터를 카피하는코드의예

for(i=0;i<pkOldSkinData->GetBoneCount();i++)
{
ppkNewBones[i] = spOldSkinInstance->GetBones()[i];
pkNewBoneData[i].m_kBound = pkOldBoneData[i].m_kBound; //본의위치정보계산용
pkNewBoneData[i].m_kSkinToBone = pkOldBoneData[i].m_kSkinToBone; //???
pkNewBoneData[i].m_usVerts = pkOldBoneData[i].m_usVerts; //본에의해 영향을받는 버텍스갯수
pkNewBoneData[i].m_pkBoneVertData = NiNew NiSkinData::BoneVertData[pkNewBoneData[i].m_usVerts]; //본에의해 영향을받는 버텍스링크정보
for (unsigned short us = 0; us < pkNewBoneData[i].m_usVerts; us++)
{
//본에의해 얼마나 영향받을지 가중치
pkNewBoneData[i].m_pkBoneVertData[us].m_fWeight = pkOldBoneData[i].m_pkBoneVertData[us].m_fWeight;
//영향받는 버텍스인덱스
pkNewBoneData[i].m_pkBoneVertData[us].m_usVert = pkOldBoneData[i].m_pkBoneVertData[us].m_usVert;
}
}
//새로운 스키닝 정보만들기
// Create the new NiSkinData and NiSkinInstance objects.
NiSkinData* pkNewSkinData = NiNew NiSkinData(uiNumNewBones, pkNewBoneData,
pkOldSkinData->GetRootParentToSkin(), spNewPartClone->GetVertices());
pkNewSkinData->SortAndMergeBoneData();
NiSkinInstance* pkNewSkinInst = NiNew NiSkinInstance(pkNewSkinData,
spOldSkinInstance->GetRootParent(), ppkNewBones);
// 새로운 스킹닝정보 붙이기
spNewPartClone->SetSkinInstance(pkNewSkinInst);
벡토를각도로
irr::core::vector3df v3Angle;
irr::core::vector3df v3Temp = irr::core::vector3df(Heading.x,Heading.z,Heading.y);
v3Angle = v3Temp.getHorizontalAngle();
SadowGeomerty 분석
UpdateShadowGeometryBound : 컬링되지 않도록 타겟오브잭트와 같은 범위를 지정한다.
아래소스와같이 데칼을 붙이기위한지형에대한 지오메트리(삼각형들)를 얻기위해서 카메라노드(m_spCamera)의 절두체를 조작해서 얻는다. 이동할때마다 회전을 보정하지않는이유는 태양광이기 때문에 방향변화가 거의없기때문이다.
void ShadowGeometry::UpdateShadowCamera(float fTime)
{
// this function moves the shadow camera so that it appears to view the
// target (caster) from infinity, facing a fixed direction. This is done
// by moving the camera so the the desired fixed direction vector is
// always coincident with the line through the caster's bounding volume
// center and the camera location
if (!m_spCamera)
return;
// get the "look at" point
NiPoint3 kTarget = m_spCaster->GetWorldBound().GetCenter();
// translate the camera to a distant point such that the camera is looking
// directly at the target point
m_spCamera->SetTranslate(kTarget - (m_kLightDir * 500.0f));//카메라는 이미빛으 방향과 일치되있다.
// set the field of view of the camera to enclose the bounding sphere of
// the caster object.
float fRadius = m_spCaster->GetWorldBound().GetRadius();
float fFOV = fRadius /
(kTarget - m_spCamera->GetWorldLocation()).Length() * 0.95f;
NiFrustum kFrust = m_spCamera->GetViewFrustum();
kFrust.m_fLeft = -fFOV;
kFrust.m_fRight = fFOV;
kFrust.m_fTop = fFOV;
kFrust.m_fBottom = -fFOV;
m_spCamera->SetViewFrustum(kFrust);
m_spCamera->Update(fTime);
}
특정방향쳐다보기(유도탄공식)
NiPoint3 kYVec = -m_kLightDir.Perpendicular();
NiPoint3 kZVec = m_kLightDir.UnitCross(kYVec);

// Rotate the camera based on the orthonormal frame
NiMatrix3 kRotation(m_kLightDir, kYVec, kZVec);
m_spCamera->SetRotate(kRotation);
m_spCamera->Update(0.0f);

광원과 같은방향으로 바라보기 예..
camera 설정하기
pkRenderer->SetCameraData(m_spCamera);
타입캐스팅
-일반포인터 타입캐스팅
NiNode* pkCamOri;
pkCamOri = NiDynamicCast(NiNode, m_spCharacterRoot->GetObjectByName("camOrient"));
타입이맞지않으면 NULL이된다.
-스마트포인터 타입 캐스팅
NiGeometry* pkGeom = NiSmartPointerCast(NiGeometry,m_kCastingObjects.GetAt(i));
겜브리오엔진 회전 기초
카메라는 기본적으로 시 점벡터가 (1,0,0), 업벡터는 0,0,1 이므로

pitch->roll ->yaw

- 쿼터니온

//쿼터니온 변환
{
NiQuaternion kQua,q1,q2,q3;

q3.FromAngleAxisZ(m_fPitch);// 피치 ..이부분중요 90도 롤하기이전에는 요 이후에 피치가된다.

q1.FromAngleAxisX(NI_PI/2); //롤
q2.FromAngleAxisZ(-m_fHeading); //요

kQua = q2*q1*q3;
m_spCamera->SetRotate(kQua);
}

- 오일러회전

FromEulerAnglesYZX(..)

오일러 회전행렬 만들기 , 접미사의 순서가 거꾸로임 즉 위의 경우 x으로 돌리고,z축돌리고 y축돌리라는뜻

짐벌락 주의...

NiNode의역활
이름그대로그밑으로자식을달수있는노드를말한다.
재귀적으로노드를 순회할때...
재귀호출함수(..)
{
들어가면서처리해야될꺼.....
if (NiIsKindOf(NiNode, pkObject))
{
NiNode* pkNode = (NiNode*) pkObject;
for (unsigned int ui = 0; ui < pkNode->GetArrayCount(); ui++)
{
재귀호출함수()
}
}
트리 끝까지 들어 간 다음 처리 해야될꺼 .....
}
식으로 코드구성할수있다.
즉 NiNode가이닌것은(상속개체포함) 밑으로 자식을가질수없다.
예제>
static void DisableZBuffer(NiAVObject* pkObject)
{
NiProperty* pkProp = pkObject->GetProperty(NiZBufferProperty::GetType());
if (pkProp)
{
((NiZBufferProperty*)pkProp)->SetZBufferTest(false);
((NiZBufferProperty*)pkProp)->SetZBufferWrite(false);
}
if (NiIsKindOf(NiNode, pkObject))
{
NiNode* pkNode = (NiNode*)pkObject;
for (unsigned int i = 0; i < pkNode->GetArrayCount(); i++)
{
NiAVObject* pkChild = pkNode->GetAt(i);
if (pkChild)
DisableZBuffer(pkChild);
}
}
}
static void DisableZBuffer(NiAVObject* pkObject)
{
NiProperty* pkProp = pkObject->GetProperty(NiZBufferProperty::GetType());
if (pkProp)static void DisableZBuffer(NiAVObject* pkObject)
{
NiProperty* pkProp = pkObject->GetProperty(NiZBufferProperty::GetType());
if (pkProp)
{
((NiZBufferProperty*)pkProp)->SetZBufferTest(false);
((NiZBufferProperty*)pkProp)->SetZBufferWrite(false);
}
if (NiIsKindOf(NiNode, pkObject))
{
NiNode* pkNode = (NiNode*)pkObject;
for (unsigned int i = 0; i < pkNode->GetArrayCount(); i++)
{
NiAVObject* pkChild = pkNode->GetAt(i);
if (pkChild)
DisableZBuffer(pkChild);
}
}
}
디파인 2개 검사해보기
#if defined(MYDEBUG) || defined(_DEBUG)
#endif
정적라이브러리링크시유의사항

-정적인 데이터 모듈관리(NiStaticDataManager)

기능별로 로더를따로등록한다.
int NiStream::RegisterLoader(const char* pcName, CreateFunction pfnFunc)

라이브러리별로 로더를 묶어서 올리는 함수지정
static void AddLibrary(InitFunction pfnInit, ShutdownFunction pfnShutdown);

기본외예 Animation,Collision 관련 로더를 활성시키려면 관련헤더파일을 인크루드시켜야한다.
예>
#include <collision.h>
#include <animation.h>

Nif파일로드시 이점에 주의하지않으면 로더가 없는부분은 데이터를 읽어들이지않는다.
2 D텍스춰 기능정리
-스크린텍스춰 만들기 & 사용하기 기본

//소스텍스춰 생성
NiSourceTexture* pkTexture = NiSourceTexture::Create(NiApplication::ConvertMediaFilename("emergentlogo.tga"));

NiScreenTexture* pkScreenTexture = NiNew NiScreenTexture(pkTexture);
pkScreenTexture->AddNewScreenRect(32, 32,pkTexture->GetWidth(), pkTexture->GetHeight(), 0, 0);

-NiScreenTexture 주요기능
AddNewScreenRect(찍을위치x,찍을위치y,끈어올크기가로,세로,끈어올위치x,y) ;

SetTexture(pkTexture) //소스 텍스춰지정

-스크린텍스춰 변경하기

먼저 변경공지를때려준다.
m_spScreenTexture->MarkAsChanged(NiScreenTexture::EVERYTHING_MASK);
AddNewScreenRect,또는 RemoveScreenRect 를 써서 추가삭제를한다.

-화면에출력
NiScreenTextureArray m_kScreenTextures;
를 화면 랜더링큰난후 한번씩찍어준다.
예>
void NiApplication::RenderScreenItems()
{
m_spRenderer->SetScreenSpaceCameraData();
const unsigned int uiSESize = m_kScreenElements.GetSize();
unsigned int i;
for (i = 0; i < uiSESize; i++)
{
NiScreenElements* pkElements = m_kScreenElements.GetAt(i);
if (pkElements)
pkElements->Draw(m_spRenderer);
}

const unsigned int uiSTSize = m_kScreenTextures.GetSize();
for (i = 0; i < uiSTSize; i++)
{
NiScreenTexture* pkTexture = m_kScreenTextures.GetAt(i);
if (pkTexture)
pkTexture->Draw(m_spRenderer);
}
}


반응형

'Gamebryo' 카테고리의 다른 글

Gamebryo Default Coordinate  (0) 2011.06.17
[Link] 게임브리오 강의  (0) 2011.03.28
gamebryotip  (1) 2011.03.21
Posted by blueasa
, |

출처 : http://blog.naver.com/spinx85/140127478677
반응형

'Gamebryo > Shader' 카테고리의 다른 글

HLSL Shader file ( fx file ) 컴파일 하기  (0) 2011.08.27
알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
HDR  (0) 2011.04.04
Posted by blueasa
, |

Device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
 Device->SetRenderState( D3DRS_SRCBLEND,  어쩌구);
 Device->SetRenderState( D3DRS_DESTBLEND, 저쩌구 );

 

 뭐 이런식으로 설정해서 나오는 알파블렌딩 적용을 통해 나오는 최종값 공식입니다.

 

 FinalColor = TexelColor × SourceBlendFactor + PixelColor × DestBlendFactor

 

 한글로 설명하면

 결과색상 = 소스칼라값 * 소스 블렌딩 계수 + 대상칼라값 * 대상 블렌딩 계수

 

 소스 - 프레임 버퍼에 전송하고자 하는 픽셀 - 그리고자 하는 픽셀

 대상 - 그리고자 하기 이전에 이미 프레임 버퍼에 존재하던 픽셀

 

 이런 최종값을 알파 텍스쳐 블렌딩 계수 변경을 통해 직접 수정할수 있다.

 

Constants

D3DBLEND_ZERO

Blend factor is (0, 0, 0, 0).

D3DBLEND_ONE

Blend factor is (1, 1, 1, 1).

D3DBLEND_SRCCOLOR

Blend factor is (Rs,Gs,Bs,As).

D3DBLEND_INVSRCCOLOR

Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).

D3DBLEND_SRCALPHA

Blend factor is (As, As, As, As).

D3DBLEND_INVSRCALPHA

Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).

D3DBLEND_DESTALPHA

Blend factor is (Ad, Ad, Ad, Ad).

D3DBLEND_INVDESTALPHA

Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad).

D3DBLEND_DESTCOLOR

Blend factor is (Rd, Gd, Bd, Ad).

D3DBLEND_INVDESTCOLOR

Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).

D3DBLEND_SRCALPHASAT

Blend factor is (f, f, f, 1); f = min(A, 1 - Ad).

 Device->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_ZERO);
 Device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR );

 

 이런 상태 설정후에 블렌딩 방정식은 다음과 같게된다

 

result =   (Src-R, Src-G, Src-B, Src-A) * (0, 0, 0, 0) + (Dest-R, Dest-G, Dest-B, Dest-A) * (Src-R, Src-G, Src-B, Src-A)

         =   (Src-R*0 ,Src-G*0 ,Src-B*0 ,Src-A*0)

           + (Dest-R*Src-R ,Dest-G*Src-G ,Dest-B*Src-B ,Dest-A*Src-A)

         =  (Dest-R*Src-R ,Dest-G*Src-G ,Dest-B*Src-B ,Dest-A*Src-A)   

 


출처 :  http://cafe.naver.com/jzsdn/6116

반응형

'Gamebryo > Shader' 카테고리의 다른 글

HLSL Shader file ( fx file ) 컴파일 하기  (0) 2011.08.27
알파블렌딩 렌더 설정  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
HDR  (0) 2011.04.04
Posted by blueasa
, |

셋업 프로젝트의 PostBuildEvent 나 PreBuildEvent 에서 배치 파일을 먼저 실행하고 나중에 다른 일들을 하려고 하면 배치 파일 이후의 작업들은 실행되지 않는 경우가 있다.

  1. "$(ProjectDir)test.bat" "$(BuiltOuputPath)"
    copy "$(BuiltOuputPath)" "$(ProjectDir)..\TestFolder\"

위의 경우 copy 명령이 실행되지 않는다.

이럴 경우에는 배치 파일 호출시 call 명령어로 호출해 주면 된다.

  1. call "$(ProjectDir)test.bat" "$(BuiltOuputPath)"
    copy "$(BuiltOuputPath)" "$(ProjectDir)..\TestFolder\"
반응형
Posted by blueasa
, |

환경변수 자동으로 추가하기

http://pragmaticstory.com/161

- 프로그램밍적으로 환경변수 등록하기
(환경변수/시스템변수 레지 위치)
Win7은 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 을 사용해야 될듯 함.
http://prodev.springnote.com/pages/1948392

- 자바 환경변수 자동 등록 배치 파일
http://blog.naver.com/PostView.nhn?blogId=huilin21&logNo=90040087259



시스템 변수 자동 등록

Win7 - cmd 창에서 전역환경변수 설정하기(bat 파일로 만들면 됨)

 http://zextor.tistory.com/2670089
반응형
Posted by blueasa
, |

1. 디버깅 정보(.pdb 파일)가 현재 소스와 일치하지 않을 때.(소스가 수정 된 경우)
   - 리빌드 시도

2. VS2008 기준 [도구-옵션-디버깅-일반-소스 파일이 원래 버전과 정확하게 일치해야 함] 체크 해제 후, VS 재실행


반응형
Posted by blueasa
, |
TISTORY The Real Identity
Daum 메일 100GB, Daum 클라우드 100GB에 당첨되셨습니다.
축하합니다!

본 메일은 Tistory.com 메일 주소 오픈 이벤트에 당첨되신 분들에게 발송되는 메일입니다.
블루아사님이 2011년 7월 8일에 만드신 blueasa@tistory.com 메일의 이벤트 자동응모에 당첨되어 TISTORY 이메일(blueasa@tistory.com)과 Daum 클라우드 용량이 각각 100GB로 증대되었습니다.

넉넉한 용량의 이메일과 Daum 클라우드로 TISTORY의 자부심을 그대로 느껴보세요.
프리미엄 블로거 TISTORY 이용자분들을 위한 TISTORY의 노력은 앞으로도 계속됩니다.
Daum 메일 바로가기 Daum 클라우드 바로가기
티스토리 바로가기
Copyright © Daum Communications. All rights reserved. 고객센터 | 공지사항


그닥 홍보도 안하고해서 안될 줄 알았는데 됐네요.

용량 많이주니 나름 잘 써먹어야겠습니다. :) 
반응형

'Etc' 카테고리의 다른 글

소프트웨어, 잉여와 공포  (0) 2011.08.29
CryENGINE 3 Free SDK  (0) 2011.08.18
JSON  (0) 2011.06.16
임금체불 시뮬레이션 (이미지)  (0) 2011.05.31
낮은 자존감이 모든 문제의 근원이다  (0) 2011.05.22
Posted by blueasa
, |
반응형
Posted by blueasa
, |