지형을 쉐이더로 처리하려고 하는데요.

2D, 3D, 다각형, 픽셀 등 게임의 그래픽 프로그래밍에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

지형을 쉐이더로 처리하려고 하는데요.

Post by 비회원 »

지형을 쉐이더로 처리할려고 하는데요..
해보니까 여러가지 문제가 있더군요..;;

쉐이더를 사용한지 얼마 안되서 모르는 문법(?)도 있고 해서
도움을 요청하고자 글을 씁니다

우선 가장 큰 문제가.
지형이 스플래팅 되어 있습니다.
0번 스테이지에 컬러맵
1번 스테이지에 알파맵
2번 스테이지는 디테일맵이 있습니다.

이것을 어떻게 처리해줘야 하나 고민하고 있습니다.;
보니까 이렇게 하는것도 있는것 같던데..

Code: Select all

	TEXCOORDINDEX[0] = 1;
	TEXCOORDINDEX[1] = 0;
	TEXCOORDINDEX[2] = 1;
	
	Texture[0] = <ColorMap>;
	Texture[1] = <AlphaMapMap>;
	Texture[2] = <DetailMap>;
	
	COLOROP[0]   = MODULATE;
	COLORARG1[0] = DIFFUSE;
	COLORARG2[0] = TEXTURE;
	ALPHAOP[0]   = SELECTARG1;
	ALPHAARG1[0] = TEXTURE;

	COLOROP[1]   = SELECTARG1;
	COLORARG1[1] = CURRENT;
	ALPHAOP[1]   = SELECTARG1;
	ALPHAARG1[1] = TEXTURE;

	COLOROP[2]   = MODULATE;
	COLORARG1[2] = TEXTURE;
	COLORARG2[2] = CURRENT;
안먹히더라구요..;

어떤식으로 해야 할지..
힌트나 조언 좀 해주세요
자료 있다면 얻을수 있는 곳이라도..;
예제 쉐이더 소스코드보면서 응용하는데
제가 가지고 있는것중엔 적당한게 없네요...;
DragonKnight
Posts: 52
Joined: 2008-01-16 12:18
Location: 일반인

Post by DragonKnight »

일단 베이스 맵이 맨 밑에 하나 깔려야 구멍이 안나구요.

베이스를 하나 까시구
그 위에 다른 텍스쳐 하나를 알파로 섞는데요.

볼따구 님인가 하는 분의 사이트에 예제가 있더군요.
거기 소스 참조하심 바로 나옵니다.


대충 방식은
만일 기본 모래 텍스쳐 위에 풀텍스쳐를 블렌딩 하시고자 하면

settexture(0, 풀alphatex);
settexture(1, 풀tex);

0번 칼라 스테이지에 diffuse 를 select 하시구
0번 알파 스테이지에 텍스쳐를 select 하시구요.

1번 칼라 스테이지에서 그냥 모듈레이트 하시면 디폴트로
0번 diffse (기본 0xFF) * 1번 풀텍스쳐 가 됩니다.
즉 diffuse 는 곱하나 마나 이므로 풀텍스쳐만 됩니다.

1번 알파 스테이지에서 그냥 모듈레이트 하시면 디폴트로
0번에서 선택한 알파텍스쳐를 current 로 끌어올린후
diffuse 와 곱하기 합니다.
즉 0번 alphatex * 1번 diffuse (기본 0xFF)
즉 diffuse 는 곱하나 마나 이므로 알파텍스쳐만 됩니다.


그럼 밑에 베이스 + 위에 텍스쳐 알파로 섞여 지겠죠.


3번 스테이지 에서는
1,2 통과한 결과에다가 합쳐주면 되겠네요.
////////////////////////////////////////////////////
// 나의 드래곤나이트 언제 만렙되나 !
////////////////////////////////////////////////////
비회원

글쓴이 인데요

Post by 비회원 »

방법을 생각하다가
다른 방법으로 했거든요.?

pass p0
pass p1
2개 잡고선
p0은 그냥 베이스맵을 그리고
p1은 컬러맵과 알파맵을 섞어서 그립니다.
그런다음 알파블렌딩을 하죠

그런데 위에 그려진(P1으로 그려진) 텍스쳐는
반투명한곳이 어둡게 반투명합니다..
검정색과 섞인듯한데요..
하지만 완전 투명한곳은 잘 나옵니다
반투명한곳만 검정색과 섞인듯한 느낌으로 나오는데요.
뭐가 문제인지 모릅니다.
다음은 소스인데요

p1가 다음과 같습니다.

Code: Select all

    pass P1
    {
	Lighting = FALSE;
		
	ALPHABLENDENABLE = TRUE;
	SRCBLEND = SRCALPHA;
	DESTBLEND = INVSRCALPHA;
        
	VertexShader = compile vs_2_0 VS1();
	PixelShader  = compile ps_2_0 PS1();    
    }

패스는 이렇고

Code: Select all

VS_OUTPUT2 VS1(float4 Pos : POSITION, float2 Tex : TEXCOORD0, float2 Tex2 : TEXCOORD1, float3 Normal : NORMAL)
{
    VS_OUTPUT2 Out = (VS_OUTPUT2)0;      
    Out.Pos = mul(Pos, matWorldViewProj);	// transform Position
    Out.Tex = Tex;
    Out.Tex2 = Tex2;
	
   return Out;
}

float4 PS1(float2 Tex  : TEXCOORD0, float2 Tex2 :TEXCOORD1) : COLOR
{
    float4 a = tex2D(ColorMapSampler, Tex2);
    float4 b = tex2D(AlphaMapSampler, Tex);
	
    return  a * b;
}

아.. 이방법도 안되는건가 라며 생각중인데 방법이 있는지 답변 부탁드립니다.
DragonKnight
Posts: 52
Joined: 2008-01-16 12:18
Location: 일반인

Post by DragonKnight »

일단 HLSL 쉐이더로 가신다면
원 패스로 하시면 됩니다.

2 패스 이상은 픽스트[fixed] 파이프라인 일 때 입니다.


알파값을 텍스쳐 값에 곱하기 하심 안데구요.

알파값을 이용하여

float4 color = lerp(베이스색상, 덧칠할색상, a);
return color;

이런식으로 블렌딩 하셔야 합니다.
////////////////////////////////////////////////////
// 나의 드래곤나이트 언제 만렙되나 !
////////////////////////////////////////////////////
Locked