프로그래밍 2017.07.12 22:59

스크린 스페이스 데칼 구현 원리

 

 

이전부터 구현해 보고 싶었던 데칼!

쉐이더 작업 이전에는, 실시간으로 면을 구성해서(버텍스)

UV 를 만들고, 데칼이미지를 붙이는 방식으로,

면 구성에 있어서도 복잡성이 높고,

문제점도 많은 방식으로 알고 있었다

 

지금에는 실시간 면 구성이라는 부분이 필요없고,

씬의 장면이 렌더링된 깊이 버퍼를 이용해서,

기존의 오브젝트 렌더링 쉐이더에 추가적인 작업만 해주면,

비교적 간단하게 구현이 가능하다

 

포스트 이펙트용 2D 이미지에 덧그린다던지 하는 방식이 아니다!

기존의 오브젝트 렌더링 쉐이더 코드에 추가적인 작업이 필요할 뿐이다

렌더링 스테이트가 바뀐다던지 하는 부분도 없다

 

 

//참고

 

https://www.slideshare.net/blindrendererkr/40000

 

http://ttmayrin.tistory.com/37

 

http://ldh9451.tistory.com/entry/Screen-Space-Decal

 

 

구현에 대한 프리텐테이션과, 소스가 있음에도 불구하고,

원리에 대해서는 설명들이 좀 부족한거 같다

소스 자체는 라인도 적고, 간단한 편인데,

일단 이해가 잘가지 않으니...

 

이것저것 뒤져보고, 연구해 보면서,

이해한 내용을 정리해 놓으려 한다

관심있으신 분들은 참고하시길 ^^

 

 

픽셀의 깊이값으로 뷰상에서의 위치값을 만들어 내는 방법

참고

 

http://m.blog.daum.net/rockeracer/38

 

디퍼드 렌더링에서는 기본적으로 사용하는 부분인것 같다,

하지만, 나는 포워드 렌더링을 사용하니,

처음보았을때,

어디서 도출된 코드인지를 몰라서, 이해가 가지 않았었다

 

 

데칼 구현의 원리에 대해서 간단하게 정리해 보자면,

 

 

 

 

 

위 이미지에서 보듯이

땅과 박스의 접점 픽셀을 골라내고, (주황색 영역)

이 픽셀에 데칼 이미지를 입히는 것이라 할수 있다

 

일단, 데칼의 이미지를 입히는 부분은 빼고,

접점 픽셀을 골라내는 부분에 집중해보자

(우리가 좀더 궁금한 부분은 이부분일 것이다)

 

접점 픽셀이란 곧,

씬의 깊이버퍼의 픽셀중

박스의 min, max 값 사이에 위치하는 픽셀이라 할수 있다,

개념적으로는 매우 간단하다,

실제 이것만 구현이 가능하다면, 땅이 얼마다 울퉁불퉁하던지 간에

땅에 착 달라붙는 데칼을 만들수가 있다

 

월드영역이라면, 우리는 꽤 간단하게 구할수 있을 것이다

하나의 점이 AABB( 또는 OBB) 의 박스 영역에 들어오는지를 체크하는 것과 동일하다

 

쉽지 않은가?

 

ㅎㅎㅎ

 

그런데, 사실, 쉐이더의 PS 내부가 아니라면, (cpp 소스 구현 상에서는)

하나하나의 픽셀의 위치를 알수는 없다,

그러므로, 픽셀 하나하나가 박스 경계속에 포함되는지 체크해 볼수가 없다

 

그럼, 쉐이더 연산에서는 구할수 있을까?

PS() 에서는,

하나 하나의 픽셀을 처리하므로, 가능하다

 

만약,

땅의 픽셀의 월드값을 알수 있다면,

픽셀 쉐이더 함수에서,

데칼박스의 min, max 값( 월드상에서의 값, 박스를 회전시키지 않는다는 가정하에)

사이에 위치하는 지를 체크하고,

매핑을 시키던지, 색상을 바꾸던지해서 표시해볼수 있을 것이다,

 

 

실제 구현을 한다고 생각해 보자

 

1. 데칼 박스를 그릴때

PS() 에서, 장면이 그려진( 위의 이미지에서는 땅 ) depth 버퍼를 가져와,

데칼 박스와 겹쳐지는 땅픽셀의 깊이값을 가져올수 있다

 

픽셀의 깊이값이 있으면, 알려진 몇 개의 방법으로,

스크린좌표상( 프로젝션이 적용된 )의 위치값을 알아올수 있다

 

픽셀의 스크린좌표( 프로젝션이 적용된) 값을 Projection Inverse 매트릭스와 곱하면,

View 상에서의 위치값이 나올것이고,

 

다시 이값을 View Inverse 매트릭스와 곱하면,

월드좌표상의 값을 구할수 있을 것이다

 

이 픽셀의 월드값이,

PS() 로 넘겨진, 데칼 박스의 min, max 값 사이에 있는지만 체크해서,

사이에 있다면, 이미지를 매핑하는 식으로

 

땅에 달라붙은 데칼을 그릴수 있다

 

-> 사실, 이론상으로만 적어보았고, 테스트를 해보지는 않았다

-> projection inv 와 view inv 를 곱해서, 월드값을 구할수 있는지 잘 모르겠다

-> 내 기억속에서는 안됐던것 같기도 한데

 

-> 어쨋든, 데칼박스를 렌더링할때 PS() 에서

-> 렌더링하는 픽셀 위치에 겹쳐지는

-> 땅의 깊이값을 구하고( z 값만이 있으므로), xy 값도 구해둔다 (위치값)

-> 이 위치값이

-> 데칼박스의 영역안에 있는지를 체크하면,

-> 위 이미지에서의 주황색 영역을, 정확히 구할수 있다라는 것을 이야기하고 싶었다

 

-> 땅이 울퉁불퉁하다던지, 면이 어떤식으로 얽혀있다던지 아무런 문제가 되지 않는다

-> 픽셀 하나하나가 영역안에 있는지를 체크한 것이기 때문데

 

-> 결론적으로, 월드값으로 체크하는 방식은

-> 실제 구현이 가능할지와,

-> 화면안에서 데칼박스가 여러개 있을때라든지,

-> 최종적으로 uv 를 어떤식으로  매핑시킬 것인지

-> 이것저것 문제가 많은 방법이긴 하다

 

 

알려진 방식으로 구현한 스크린 스페이스 데칼

(밑의 이미지들)

 

 

 

 

 

 

위에 링크걸어둔 사이트에서의 데칼 구현 방식에 대해서 설명해 보자면,

 

데칼박스의 렌더링 픽셀의 위치에 해당하는

씬의 깊이값을 구하고,

이 씬의 깊이값을 카메라 TopRight 를 이용해서, View( 카메라뷰) 에서의 위치값을 구한다

 

씬픽셀의 View 위치값 (xyz) 이,

데칼박스의 영역에 들어오는지를 체크하기 위해서

 

카메라뷰와 데칼박스월드의 inverse 매트릭스와 곱하여

 

-> zMatrix zMatInv, zMatW;
-> zMatrixInverse( &zMatInv, NULL, &g_matView );    
-> zMatrixInverse( &zMatW, NULL, &m_LocalToWorld );

-> zMatrixMultiply( &zMatInv, &zMatInv, &zMatW );

-> zMatInv 값을 넘겨준다

 

-> g_matView 는 전역 카메라뷰

-> m_LocalToWorld 는 데칼박스의 회전, 스케일, 이동이 포함된 매트릭스

 

 

View 위치값을 local 값으로 변경

 

 

씬의 픽셀의 local 위치값을

데칼박스의 로컬값 min, max 와 비교해서,

영역안에 들어온다면, 현재 렌더링되는 데칼박스의 pixel 색상을 변경

-> 어차피 겹쳐지는 부분이므로,

-> 현재 렌더링되는 데칼박스의 pixel 의 색상을 조정해주면, 이것이 데칼로 표시된다

-> 이것이 핵심!

 

주의할것은, 데칼박스는 계산의 편의를 위해서,

정점의 xyz 위치가 -05 ~ 0.5 사이의 값들로 이루어진 박스라는 것이다

(맵에서는 필요한만큼 스케일해서 사용)

 

min( -0.5, -0.5, -0.5 ) max( 0.5, 0.5, 0.5 ) 

이렇게 구성해 놓으면, UV 값 역시 1:1 매칭이 가능하다

 

그래서, PS() 에서 이런식으로 구현이 가능해진다

 

//decalLocalpos 는 씬픽셀의 로컬위치값

 

// 위치가 xyz 각각의 축으로 0.5 범위가 넘으면 버려진다

clip( 0.5 - abs( decalLocalpos.xyz ) );

 

// 위치값을 그대로 uv 값으로 사용

TexUV = decalLocalpos.xz + 0.5f;    

 

 

//참고로 View TopRight 구하는 부분은 이렇게
zMatrix matInvProj;
zMatrixInverse( &matInvProj, NULL, &g_matProj );

 

Vector4 vTopRight;
vTopRight.x = 1;
vTopRight.y = 1;
vTopRight.z = 1;
vTopRight.w = 1;

D3DXVec4Transform( &vTopRight, &vTopRight, &matInvProj );
vTopRight.y = -vTopRight.y; //?
//vTopRight /= vTopRight.w;

 

구현 소스는 위에 링크된 블러그 들에서 자세하게 구현되어 있으니

(나역시 거의 그대로 베껴서... ^^ 감사합니다 ~! )

생략해도 될듯

 

 

posted by 비케이제이

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅇㅇ, 이전부터 사용하시던 거라면, 깊이버퍼 문제는 아니겠네요, ㅎㅎ,

    저의 경우는 따로 나누지않고, 그냥 그대로 넘겨서 사용을 합니다, (in.depth.z 값 그대로 사용)
    gfar 로 나누는 부분이, z / w 과 비슷하게, 뎁스값을 ( -1 ~ 1 ) 범위로 만들기 위한 것이라면,
    위에 설명된 데칼구현에서 좌표값의 영역과는 다를수 있을것 같습니다,

    으음~~ gfar 로 나누지 않고, 테스트를 한번 해보시는것도 좋을것 같습니다

    2018.02.06 13:54 신고
    •  Addr  Edit/Del 배우는중

      아 바꾸고나니 결과가 바뀌긴 했습니다.(여전히 뭔가 이상하긴 합니다.. 카메라와 오브젝트 사이의 위치에 따라 모양이 바뀌기도 하고;; )

      텍스쳐 여러개가 상자에 그려지는 현상이 나타나고.. 여전히 문제가 있지만.. 깊이 텍스쳐 자체의 문제는 아니었던거 같군요...
      rightTop도 비케이제이님이 쓰신 공식대로 구해봤으니... 조금 더 분석을 먼저 해봐야겠습니다... 귀중한 시간 쪼개주셔서 감사합니다.(물론 하다가 다시 질문 드릴거 같은 느낌이지만.. ㅠㅠ)

      2018.02.06 14:07 신고
  3.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅎㅎ 화이팅! 입니다

    2018.02.06 14:15 신고
    •  Addr  Edit/Del 배우는중

      다시 질문좀 드리겠습니다...
      어떻게든 지금 텍스쳐는 뜨긴 하는데.. 텍스쳐가 조금 이상하게 뜨기도 하거니와.. 카메라의 위치에 따라서 그려지는 곳이 있고 안그려지는 곳이 있고 하더군요...

      예를들어 카메라가 0, 0, -10 위치에 있다면 0, 0, 1에서만 그림이 그려지고 0, 0, 5 위치에 있으면 0, 0, 10 위치에서만 그려지고.. 한다는 식으로..(다만 Z축만 일치하면 X축은 어디든 상관 없이 일단 텍스쳐가 그려는 집니다.. 모양은 다 다르긴 하지만..)

      혹시나 해서 uv값 을 구하던 ObjPos.xz + 0.5f를 ObjPos.xy + 0.5f로 건드려보긴 했는데... 이건 뭐가 문제인지 잘 모르겠더군요..

      p.s:아 조금 정정하면.. 그냥 카메라 위치에 따라서 텍스쳐가 그려지는 모양이 다릅니다. 텍스쳐가 그려지는 위치도 다르고요...

      2018.02.06 20:23 신고
  4.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅇㅇ, 일단 uv 매핑을 하기전에, 단일 컬러로, 색을 입혔을때는 정확하게 출력이 되나요?

    2018.02.07 09:18 신고
    •  Addr  Edit/Del 배우는중

      넵. 우선 몇가지 테스트를 해봤습니다. 어떤것이 정확한 값인지는 잘 모르겠네요;;;
      1.깊이 텍스쳐 만드는 구간의 경우 Input.depth.z / Input.depth.w 값을 바로 색에 적용할 경우 항상 하얀색이 나옵니다. 카메라 위치에 상관 없이 1이라는 값이 나오더군요.(위의 depth는 링크를 제시해주신 따분한놈님이 하신 것처럼 정점 위치에 WV만 곱한 값입니다.)
      2.screeenPosition의 경우(Input.Clip.xy / Input.Clip.w) x값이나 z 값이 카메라의 위치에 따라 값이 바뀝니다.(Input.Clip는 WVP를 곱한 녀석 입니다.)
      p.s:screenPosition의 경우 screenPosition.x = screenPosition.x * 0.5 + 0.5
      screenPosition.y = screenPosition.y * -0.5 + 0.5의 연산은 끝난 상황입니다.
      3.CameraRightTop의 경우 x, z 값은 카메라 위치에 상관 없이 변화가 없었습니다.(항상 1인 느낌이 들듯... 밝은 색이었습니다.)
      4.viewRay.x의 경우는 screenPosition의 영향을 받듯이 카메라 위치에 따라 값이 바뀌었습니다. 하지만 viewRay.z는 따로 값이 바뀌는 현상을 발견하지 못했습니다.
      5.viewPos.x의 경우 역시 viewRay.x와 마찬가지였고 z값의 경우도 viewRay.z와 마찬가지였습니다.(특이사항으로는 텍스쳐가 그려지듯이 안에 붉은상자가 하나 더 그려지는 현상이 나타났습니다.)
      6.ObjectPos.x의 경우 카메라가 중앙에 있을 때 ObjectPos가 중앙에 있으면 상자는 검은색이고 상자가 카메라 중심으로 오른쪽으로 가면 검은색 상태에서 빨간 상자가 하나 더 그려지며 카메라 기준 왼쪽으로 가면 viewRay.x에서 나타나던 현상처럼 붉은색을 띄는(작은 상자가 더 그려지는 현상 없이) 현상이 나타났습니다. ObjectPos.z의 경우 카메라에 비춰지는 화면 내부에서는 특별한 현상 없이 검은색이 유지됬지만 카메라의 Z축과 최대한 멀어진 상황에서 좌측, 혹은 우측으로 이탈하면 일부분이 빨간색으로 보이는 현상이 나타났습니다.(작은 상자가 나타난 것인지 어떤 것인지는 알수 없었습니다.)
      7.depth(tex2D(depthSamp, screenposition).r 값으로 나온..)의 경우는 카메라 위치와 상관 없이 동일하게 항상 값이 1인 것처럼 밝은 빛을 띕니다.

      정확히 어디서 값이 잘못된것인지 몰라 일단 각 값마다 반환했을 때 나타나는 증상 모두를 적어봤습니다.

      p.s2:작은 상자의 경우 제가 screenPosition을 테스트 하면서 * 0.5 + 0.5 부분도 빼고 테스트 했었던걸 깜빡하는 바람에 생긴 문제였습니다.
      다만 작은상자가 안나오는걸 빼면 증상엔 별 차이가 없었습니다..

      2018.02.07 10:28 신고
  5.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    엇, 으음~~
    음, 일단 uv 매핑과 상관없이 단일컬러로 출력했을때도
    데칼이 제대로 출력되지 않는다는 이야기신것 같은데요,

    아, 일단 데칼박스를 단일컬러로 출력한다는 것은
    데칼연산이 다 끝난다음에, uv 매핑하지 않고,
    아무 색상이나 임의로 넣어서 출력하는 것을 의미합니다,
    (일단, uv 매핑 문제인지,
    uv 와 별도로 기본 데칼 연산에 문제가 있는건지 확인이 필요하구요,)

    일단 단계적으로 나누어서 접근하시는 것이 좋습니다,

    1. 데칼 박스는 하나만 생성
    2. 데칼연산을 끄고, 그냥 박스를 출력시켰을 경우에는 제대로 출력이 되는지 확인
    (일반적인 렌더링으로 확인)
    3. 데칼연산을 적용하고 단일컬러로 오류없이 출력되는지 확인


    지금 예로주신 현상들은,
    쉐이더 연산에서 여러가지로 발생할수 있는 현상들이라,
    뭐라 콕찝어 이야기드리기는
    힘들듯 하구요,

    참고로, 깊이버퍼는
    정점의 로컬값 * (월드,뷰,프로젝션) 매트릭스를 곱한 결과값에서 z 값만을 기록해서 사용을 하였구요, (z 를 특정값으로 나누지않고, 그대로 사용)

    2018.02.07 11:22 신고
    •  Addr  Edit/Del 배우는중

      1.데칼 박스는 하나만 생성하도록 바꿨습니다.
      2.일단 말씀하신 바가 잘 이해는 안됬는데... return float4(1, 0, 0, 1)로 할 경우엔 붉은 색이 잘 나옵니다.(그 외에도 정점에 worldMatrix만 적용한 float v라는 값의 경우 월드 값에 따라 z축이 1이상 이면 파란색 x축이 1 이상이면 붉은색으로..)
      3.연산을 적용하고 단일컬러로 한다는 것이.. 어떤 말씀인지 잘 모르겠습니다...

      깊이버퍼는 말씀하신대로 고쳤는데.. 현재로서는 특별한 차이가 나타나지 않네요..

      2018.02.07 11:57 신고
  6.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅇㅇ, 특별한 처리가 아니고,
    쉐이더에서

    위의 댓글의 코드를 예를 들어보자면,
    float4 ps()
    {
    float2 uv = GetPixelUV( _In );

    float4 vPixelDepth = tex2D( Samp_Tex_DepthBuffer, uv );
    //씬이 그려진 깊이버퍼를 가져오고,

    float3 decalLocalpos = GetPixelLocal( uv, vPixelDepth.a );
    //씬의 픽셀의 로컬값을 구한다

    //그 후, clip 처리
    clip( 0.5 - abs( decalLocalpos.xyz ) );
    //clip 처리를 하게되면, 데칼에 해당하지 않는 픽셀은 버려집니다
    //clip 된 픽셀은 여기서 바로 리턴되어서, 아무 처리가 되지 않습니다

    //그러므로, 요기까지 온 픽셀은 데칼로 표시될 픽셀입니다
    return (1,1,1,1); //요 색상은 아무 컬러나,
    }

    위와같이 테스트하여서,
    단순데칼컬러가 제대로 출력된다면,
    매트릭스나, 깊이버퍼는
    문제가 없다고 볼수 있습니다

    (데칼이 붙여질 위치에 단단히(?)
    고정이 되어 있어야 합니다, 카메라따라
    움직인다던지하면, 뭔가 문제가 있는것이지요)

    (참고로, 본문 이미지 중에,
    흰공이 들어간 검은박스에서
    주황색으로 표시한 부분이 있습니다,
    주황색으로 표시된 부분처럼, 출력이
    되어야 한다는 이야기지요)

    일단, 단순데칼컬러가 잘 출력된다면,
    거의 끝난것입니다, ㅎㅎ
    uv 매핑만 만져주면 되는데,

    그냥, 제일 기본적으로는
    하늘을 쳐다보는 평평한 바닥면에
    데칼을 붙인다고 할때,

    uv = decalLocalpos.xz;

    요렇게만 해주셔도 잘 출력이 될것입니다

    데칼이 붙을 상황에 따라,
    uv = decalLocalpos.xz;
    uv = decalLocalpos.zy;
    ...

    뭐, 여러가지로 테스트 해보실수 있습니다

    2018.02.07 13:50 신고
    •  Addr  Edit/Del 배우는중

      말씀하신바대로 했더니.. 깊이버퍼나 메트릭스쪽이 이상이 있는걸로 결론이 나왔습니다;;;

      깊이버퍼 코드는 현재
      VertexShader

      Output.Position = mul(Input.Position, matWorldViewProjection);
      Output.Depth = mul(Input.Position, matWorldView);

      PixelShader
      float depth = Input.Depth.z;
      float4 Out = Input.Depth.z / Input.Depth.w(사실 이 Out이 기존의 내용이었으나 z만 입력해주셔도 된다고 하시기에 위의 내용으로 바꿨습니다.)
      return float4(depth.xxx, 1);

      메트릭스의 경우 view, world, projection은 다이렉트에서의
      device->GetTransform(D3DTS_PROJECTION, &matProjection);
      device->GetTransform(D3DTS_VIEW, &matView);
      를 통해서 얻어오고 있고
      world의 경우
      D3DXMatrixIdentity(&matWorld);
      D3DXMatrixScaling(&matWorld, m_Size.x, m_Size.y, m_Size.z);
      D3DXMatrixTranslation(&matWorld, m_Position.x, m_Position.y, m_Position.z);
      를 통해서 계산하는 중입니다.

      그리고 worldviewProjection으로 넘기는 경우에는
      matWorldViewProjection = matWorld * matView * matProjection;
      을 통해 연산한 뒤에 setMatrix함수로 바로 넘겨주고 있구요.

      역행렬의 경우
      D3DXMatrixInverse(&matInvWorldView, nullptr, &worldView);로 구하는 중이며,
      카메라 RightTop의 경우
      D3DXVECTOR4 camRightTop = D3DXVECTOR4(1, 1, 1, 1);
      D3DXMATRIXA16 invProjection;
      D3DXMatrixInverse(&invProjection, nullptr, &matProjection);
      D3DXVec4Transform(&camRightTop, &camRightTop, &invProjection);
      camRightTop = camRightTop /camRightTop.w;
      camRightTop.y = -camRightTop.y;
      를 사용해서 구했습니다.

      메트릭스는 대개 자동적으로 함수가 처리해줘서 틀릴 부담이 적은거 같은데.. 깊이 버퍼에서 뭔가 잘못된 걸까요?

      2018.02.07 14:25 신고
    •  Addr  Edit/Del 배우는중

      아 뭔가 조금 바뀌었습니다.

      1.깊이버퍼 구할 때 기존에는 WorldView 행렬만 곱해줬었는데 이번엔 아예 따로
      Depth = mul(Position, World);
      Depth = mul(Depth, View);
      mul(Depth, Projection)까지 계산한 다음 Depth를 넘겨서 계산했고,

      오브젝트 위치도
      float4 ObjectPos = mul(viewPos, matInvProjection);
      ObjectPos = mul(ObjectPos, matInvView);
      ObjectPos = mul(ObjectPos, matInvWorld);
      이런식으로 차례대로 했더니 그려지기는 합니다.(다만, 카메라 영향을 안받는다고 하긴 어정쩡한게 clip를 사용했음에도 불구하고 박스가 그려지고 그려진 박스는 카메라 위치와 상관없이 하얗게 계속 그려는 지는데.. 텍스쳐를 씌울경우 uv좌표값에 이상이 있는 것처럼 계속 바뀌더군요...)

      p.s:어디서 잘못했는지, 혹은 뭘 추가해야되는진 모르겠는데.. 주황색 영역처럼 발리는 느낌이 아니라 존재하지 않는(그려지지 않은) 데칼 박스에 텍스쳐를 입히는 느낌만 드는 모양이 나오고 있습니다;;;

      2018.02.07 15:05 신고
    •  Addr  Edit/Del 배우는중

      아.. 감사합니다.
      일단 완벽하게는 아니지만 뭔가 조금 된거 같은 느낌이 듭니다.

      우선 상자 두개를 만들어서 clip부분을 빼버렸습니다.(상자 위치를 확인하려고..)

      그리고 진행하는데 텍스쳐가 여러개 그려지기는 해도 일단 고정된 채로 발려야 할 대상의 큐브에 발리는 모양이 확인되었습니다.

      물론 위치 같은 면에서는 조금 이상하다는 느낌이 언뜻 들기는 하는 상황이긴 합니다만... 어찌되었건 뭔가 조금 진척은 있는 느낌입니다.

      clip를 추가하면 이제는 아예 텍스쳐가 안보이는 현상은 나타나지만.. 그래도 뭔가 조금 진척이 있는 느낌이 드네요 드디어..

      2018.02.07 16:22 신고
  7.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    흐음~~~

    ObjecPos 계산이 잘못되었습니다
    본문 코드나, 예제코드를 일단 그대로 충실히 사용하고,
    구현 이후에, 자신의 환경에 맞추어 수정하는게 좋습니다,
    그러면, 문제가 생기더라도 어떤 부분인지 바로 체크가 가능하지요,

    하아.........

    특히 매트릭스 계산은 꼼꼼하게 체크해야 합니다,
    곱셈 순서도 중요하고,

    역변환 과정도 완전히 틀렸습니다,
    invProj -> invView -> invWorld
    매트릭스 계산은 이런식으로 역변환되지 않습니다,,,
    (본문의 코드 예제를 참고해 주세요)

    월드값을 로컬값으로 변환시킬때는
    일반적으로,

    invView * invWorld 결과값을
    정점에 곱하고, 이 결과값을
    matProj (inv 아닙니다) 에 곱해줍니다,

    참고로 하시고,

    매트릭스 계산은 순서도 중요합니다
    기본적으로 A*B != B*A 이기 때문에,
    곱셈순서가 맞지않으면, 제대로된 결과가 출력되지 않습니다,

    우오오~~~~~

    2018.02.07 18:05 신고
    •  Addr  Edit/Del 배우는중

      우선은.. 죄송하다는 말씀부터 드리겠습니다.
      몇일 잡으면서 하다보니 초조해져서 별짓을 다한탓에 ObjectPos에서 메트릭스 계산하는 방식민 수십가지가 되었고 거기서 일부 추출하다보니 순서가 이상해졌습니다.

      다이렉트를 통해서 world 역행렬, view역행렬을 꺼내다가 (world역 * view역) * (world * view) 를 계산했을 때 항등행렬이 나와야 할텐데 뭔가 중간에 자꾸 끼는 느낌(예를들어 위 두개를 곱한 행렬에서 1000 | 0100 | 0010 | 0001이 나와야 하는데 일부 0의 자리에 아주 작은 소수값들이 들어가는 현상..)이 나다보니 이걸 없애려고 하다가 '내가 계산식을 잘못알았나? 곱셈 순서도 뒤집어야 하나?'라는 생각에 미쳐서 이것저것 꼽아놨었고 그 꼽은 코드들 내에서 보고 쓰다보니 잘못된 코드를 올린거 같습니다...

      원래 초기엔
      matWorldView = matInvWorld * matInvView;
      D3DXInverse(&matInvWorldView, nullptr, &matWorldView)
      위의 것을 다이렉트에서 가져다가

      ObjectPos = mul(ViewPos, matInvWorldView)
      요걸 사용했었습니다.(링크에서 제시해주신 코드대로..) 그러다가 중간에 자꾸 이상한 값이 나오다보니 이것저것 건드리면서 기존의 것들은 주석처리해두고 하다보니 이렇게 되어버렸네요...

      우선 이것에 대해서는 정말로 죄송합니다.

      그리고 도와주신 것에도 불구하고 면목없게 아직까지도 제자리 걸음 상태인지라... 이렇게 귀찮게 해드린 것도 좀 죄송합니다... ㅠㅠ

      2018.02.07 18:52 신고
  8.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    아니, 괜찮습니다, ㅎㅎ,

    (작업 짬짬이 왔다갔다 하는 것이고,
    질문 주시는 분도 거의 없기 때문에, 저도 보면서
    다시 되새김을 하는 시간이 됩니다)

    저도 뭐 딱하고 바로 구현한게 아니라서,
    이것저것 여러가지로 테스트하면서, 구현한 것이라,
    구현중 막힐때의 심정을 잘 압니다 ㅎㅎ (아주 잘알죠)

    그나저나, 적어주신 내용을 보니,
    그냥 막 사용하신 코드가 아니고, 테스트 하면서 바꾼 코드였군요,

    제가 좀 성급했습니다,
    죄송합니다 ^^

    그런데, 코드 바꿔서 해보셨는데도 제대로 출력이 안되나요?
    흐참,,, 뭐가 문제일까요
    (뭐, 아주 사소한 문제일수도 있습니다,
    나중에 '앗' 하고 보이는 그런 문제일수도 있을듯...)

    뭐, 어쨋든,
    저의 경우를 예로 들어보자면,
    뭐, 저는 천천히 합니다,
    (최대한 느긋하게 마음먹으려고 합니다, 마음이 편해야지 작업이 더 잘되더군요)

    그리고, 하나씩 하나씩
    단계적으로 이해를 하면서, 구현을 해나가면
    그 단계 하나하나가 자산이 되는것 아니겠습니까 ㅎㅎ

    언제나 화이팅! 입니다
    후후후후후

    아, 그리고
    값 맨 끝자리에 아주 작은 소수값 들어가는 현상은
    float 값의 부정확성으로, 원래 그렇습니다,

    1.0 -> 1.00002 뭐, 이런식으로 표시되는 현상 맞으시지요?
    파일에 float 값 저장하고, 읽어들이면 특히 더 두드러지는 현상입니다,

    2018.02.07 19:43 신고
  9.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    그러고보니,
    블러그 개설한 이후, 최고로 많은 질,답이 오고갔네요,
    우옷!
    다시 보니까, 진짜 엄청난듯!

    2018.02.07 19:47 신고
    •  Addr  Edit/Del 배우는중

      뭔가.. 색깔별로 출력하고 되기는 되는데.. 중간에 데칼 박스와 같은 크기로 구멍이 나는 부분도 발생하더군요;;(텍스쳐를 바를 대상의 공간중에..) 그리고 어찌된 것인지.. 카메라의 위치에 따라 그려졌다 안그려졌다 하는 곳도 있고 col을 리턴하면 이젠 텍스쳐는 아예 안보이고 검은색 상자만 둥둥 떠다니는 모양도 나오고.. 메트릭스 값은 이것저것 건드려봤는데도 소용도 없고... 여러가지로 건드려봤는데 원인을 못찾는 바람에 좀 멘붕타서 데칼은 나중으로 미루려고 합니다.. 도와주신 것에 정말 감사드립니다...

      2018.02.08 12:43 신고
  10.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    헉, 저런!
    열심히 하셨는데, 아쉽네요 ^^
    그래도, 뭐,
    다른것도 구현해 보면서,
    천천히 하시는 것도 좋은 방법일듯 합니다,
    기운내시길!

    2018.02.09 22:16 신고
    •  Addr  Edit/Del 배우는중

      혹시 몇 가지만 더 여줘봐도 되겠습니까?(막상 그냥 끝내려니 좀 그래서..)
      기본적인 것에서 제가 뭔가 틀렸는가에 대한 확인차 여쭤보려고 합니다..

      1.깊이 텍스쳐는 상자를 제외한 다른 오브젝트들의 깊이를 구하셨는지?
      2.깊이 텍스쳐 생성 이후에 SSD 코드에서는 상자 및 다른 오브젝트들의 깊이를 구해서 화면상의 좌표로 뿌렸는지?

      Begin()
      BeginPass()
      SSD상자->drawSubset();
      오브젝트1->drawSubSet();
      EndPass()
      End()
      요런 형태로 코드가 쓰여져 있는지에 대한 질문 입니다.

      위의 내용보면 깊이 텍스쳐 구하는 코드 따로, SSD 코드 따로 배치되어 있어서 저도 .fx파일 두개를 만들었는데, 혹 이 부분에서 제가 잘못 이해해서 잘못된 깊이텍스쳐를 만드는 바람에 안나오는건가 싶어서 말이죠...

      2018.02.10 10:55 신고
    •  Addr  Edit/Del 배우는중

      뭔가 좀 이상하다 싶긴 합니다.
      1.uv의 경우 obj.xy를 하면 텍스쳐가 제대로 나오기는 합니다.
      2.그런데 아래쪽에
      col.a *= fadeOut;
      col *= ( 1.f - max( (ObjAbs.z-0.25f)/0.25, 0.f) );
      출처: http://ldh9451.tistory.com/entry/Screen-Space-Decal [이름없음]
      요 코드만 추가하면 텍스쳐는 안나오고 검은 화면만 나옵니다.
      3.이 검은 화면도 특정 구역을 벗어나면 나오지 않는 현상이 발생합니다.

      1번과 2번의 경우 새로 구축한 다이렉트 환경에서 본 것이고 3번은 기존의 코드에서 본 것인데.. 조금 테스트가 필요할듯 하여...

      혹시 이것과 관련해 아시는 바가 있는지 좀 여쭤보고 싶습니다..

      p.s:새로 구축한 환경의 경우 카메라가 움직이지도, 오브젝트가 움직이지도 않는 상황이라서 위에서 아래를 내려다 봤을 때나 오브젝트와 카메라간의 거리에 따른 변화는 체크하지 못했습니다.

      2018.02.10 14:03 신고
  11.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    1. 깊이버퍼는 씬의 모든 것들의 깊이값이 기록되어 있어야 합니다,
    (데칼은 제외하고,)
    2. 음? 깊이버퍼는 필요한연산에서 사용만 하면되고, 화면에 그릴필요는 없습니다,
    데칼그릴때, 깊이버퍼텍스쳐 가져와서 사용만 하면 되지요,

    깊이버퍼 텍스쳐를 열고,
    씬의 모든것을 렌더링
    ( 이때 매핑같은거 빼고, only 깊이값만 기록, 당연히 데칼은 제외)
    깊이버퍼 텍스쳐 닫기

    다른거 렌더링할때, 쉐이더 코드에서
    깊이버퍼 필요하면, 가져와서 사용
    ---------------------------------------------

    2. 이상하네요, 코드자체는 단순코드로,
    매핑된 데칼을
    색상만 옅게 바꿔주는건데,
    검은 화면이 나온다??

    데칼쉐이더 코드나, 공유값이
    다른데도 영향을 끼치지는 않는지 확인이 필요할듯,

    음, 추측이지만,
    데칼 자체의 문제 외에도,
    렌더링이나, 렌더링 순서, 렌더링 스테이트, 깊이버퍼 기록할때의 셋팅 등에 오류가 있을수도 있구요,

    2018.02.10 15:42 신고
    •  Addr  Edit/Del 배우는중

      우선 -------- 윗쪽의 1, 2번에 대한 이야기.
      1.깊이 텍스쳐 만들 때 제가 뭘 잘못했나 해서 이 부분에 대해 여쭤봤습니다.(데칼 상자까지 깊이버퍼 값을 구해야하나 말아야 하나의 여부 때문에..)
      2.Clip.z / Clip.w은 위쪽에서도 코드로 나오고 이렇게 화면상의 깊이 값을 구한 걸 가지고 박스 위치와 여산해서 구한다고 하길래 여쭤봤었습니다.

      --------- 아래쪽.
      혹 제 다이렉트가 이상한가 싶어서 확인해봤습니다. 그래서 정말 간단하게 빈 프로젝트 하나 놓고 쉐이더 확인만 하기 위해 가져온 코드랑 연결해서 계산해봤는데 마찬가지이더군요...
      깊이 버퍼 셋팅 코드는 그림자의 그것과 똑같습니다.(렌더 몽키에서도 렌더타겟 불러다 하는 것은 똑같구요.) 실제로 이 셋팅 코드로 그림자 돌렸을 때 그림자는 멀쩡히 잘나오는...

      2018.02.10 17:32 신고
  12.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    아, 그런데,
    좀 궁금한 것이,
    다른 여러가지 쉐이더 구현도 해보신 건가요?
    노말매핑이나,그림자, 간단한 포스트 이펙트 등등,

    2018.02.10 15:46 신고
    •  Addr  Edit/Del 배우는중

      네.
      노말매핑도 해봤고 디퓨즈, 스펙큘러 매핑도 해봤고 스플래팅도 쉐이더 등.. 기타 다른 쉐이더 구현도 해봤습니다.

      2018.02.10 17:25 신고
  13.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅇㅇ, 혹시나 다른 경험없이, 급하게 구현하시는것은 아닌가해서,
    질문드려 보았습니다, ㅎㅎ

    그러면은,
    col *= ( 1.f - max( (ObjAbs.z-0.25f)/0.25, 0.f) );
    이 코드만 빼면은, 정상적으로 출력된다는 것인가요?

    그렇다면, 99% 끝난것 같은데요 ㅎㅎ

    데칼의 색상을 옅게 만드는것은,
    여러가지 방식으로 테스트해볼수 있는 것이라,

    2018.02.10 18:38 신고
  14.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    ㅇㅇ, 저때 잠깐
    걸렸던 부분이,
    GetTransform 부분이었는데,

    매트릭스를 얻어올때,
    GetTransform 으로 얻어온,
    카메라 view, proj 값은
    쉐이더에게 넘겨질, 정확한 값들이겠지요?
    (혹시나해서 질문드려봅니다)

    2018.02.10 18:57 신고
    •  Addr  Edit/Del 배우는중

      우선 테스팅 환경과 기존에 만들어보던 곳 양쪽에서 증상이 똑같았는데
      테스팅 환경의 경우 아예 D3DXMatrixLookAtLH나 PerspectiveFovLH 함수를 통해서 프로젝션과 뷰 행렬을 만들었습니다. 그런데도 불구하고 겟 함수로 받아온 메트릭스와 같은 증상이 있더군요.(급하게 float 함수 대충 만들어서 0~10사이의 위치를 왔다갔다 하게 했습니다.)

      문제로 보건데 그것은 아닌거 같습니다.
      일단 아예 처음부터 쉐이더 코드부터 시작해서 작성해보는게 좋을 거 같아서 그리 해보려고 합니다.(깊이 텍스쳐 구하는 코드까지도 말이죠..;; )

      그리고 확인좀 재차 하자면, 깊이 텍스쳐 만드는 곳에서 데칼 상자의 깊이는 구하지 않으셨었지요?(혹시나 제가 데칼 상자의 깊이를 안구해서 터지는 문제인가 싶어서 드린 질문입니다;; )

      2018.02.10 19:22 신고
  15.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    당연히, 씬의 적정위치에 새로운 데칼을 입히는 개념이기 때문에,
    깊이버퍼에는 데칼상자가 기록되면 안됩니다
    (데칼상자의 깊이값은 기록하지 않았으므로, 깊이버퍼에서는,
    데칼상자의 깊이를 구할수 없습니다)

    카메라 움직일때마다, 뭔가 문제가 생긴다면,
    GetTransform 사용하지 말고,
    g_matView, g_matProj 추가 하셔가지고,
    카메라 뷰, 프로젝션 값을 각각 저장해두고,
    쉐이더에 이값을 넘겨서 한번 사용해 보시기를,

    2018.02.10 19:30 신고
  16.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    참고설명 드리자면,

    ssd 개념 자체가,
    깊이버퍼에 기록된 픽셀을 로컬값으로 돌려서
    로컬값의 decal 영역과 비교해서, clip
    -> 따라서 decal 의 깊이값 자체가 필요가 없습니다,

    decal.z -> 순수 로컬값이고,
    (-0.5 ~ 0.5) 범위의 값이지요

    2018.02.10 19:33 신고
  17.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    윗글중에,

    테스팅 환경의 경우 아예 D3DXMatrixLookAtLH나 PerspectiveFovLH 함수를 통해서 프로젝션과 뷰 행렬을 만들었습니다. 그런데도 불구하고 겟 함수로 받아온 메트릭스와 같은 증상이 있더군요.(급하게 float 함수 대충 만들어서 0~10사이의 위치를 왔다갔다 하게 했습니다.)

    -> 무슨 말인지??
    -> 뭔가 요상한 설명이군요 ~~ ㅎㅎㅎ

    2018.02.10 19:38 신고
    •  Addr  Edit/Del 배우는중

      1.다행입니다. 데칼 상자의 깊이 값을 안구해서 터지는 건줄...

      음.. GetTransform문제는 아닌거 같았는데 그건 3번과 관련된 내용이니.. 여기선 생략을..

      2.decal의 깊이 값이 필요가 없다는건 decal의 상자에 대한 말씀인거라는 생각은 드는데... 김포프님 설명에서도 그렇고 decal 상자를 통해서 안인지 밖인지를 계산한다고 하던데.. 상자의 배치는 어떻게 하는 것이며... 데칼을 특정 텍스쳐에 바를 때 그 위치는 뭘로 정하는지요??(어찌되었건 데칼을 적용하는 코드에서 상자의 위치가 어딘지는 알려줘야 상자와 해당 픽셀의 위치가 겹친다는 신호를 받을거 같은데.. World를 따로 넘겨주는지 아니면 다른 방법이 있는지..? 저는 여지껏 MESH하나를 만들어서 마우스 좌표 따라서 움직이도록 world 연산을 넘겨서 데칼 적용하는 곳에서 fx파일로 넘겨줬던지라..)

      3.좀 뭔가 꼬였던거 같습니다 설명이.
      말 그대로 해당 함수들을 사용해서 View, Projection 행렬들을 아예 처음부터 만들었습니다.
      기존의 다이렉트 코드에 한게 아니라 새 프로젝트를 만들어서 셋팅했던 거고요.
      즉, GetTransform으로 View나 Projection을 받아왔던 기존코드와 다르게 아예 처음부터 View, Projection을 설정했다는 것이지요.
      또한 worldMatrix를 D3DXMatrixTranslation 함수에 새로 만든 float 변수를 통해서 왔다갔다 하게 했다는 이야기였습니다.

      2-
      데칼 박스 자체는 쉐이더 코드 상에서 가상의 변수를 통해서 만들어지는 것 같다는 생각은 기존에 했었는데.. 지금에 와서는 뭐랄까... 이게 다른 박스가 별도로 필요한가 싶어서 말이죠...;

      2018.02.11 02:45 신고
  18.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    데칼을 특정 위치에 놓아주기 위해서는
    데칼도 당연하게 world 위치에 놓아주어야 합니다,
    데칼도 일반 오브젝트와 마찬가지로 월드매트릭스가 필요하지요,
    (데칼을 자신이 원하는 위치에 놓을수 있어야 하니까요,)

    SSD 는 이 월드에 놓인 데칼을 다시 로컬영역으로 변환시켜서,
    계산하는 방식이구요,
    (그래서, inv 연산을 통해서 world -> local 로 변환시켜주는 것입니다)

    음,,, 예를들어,
    맵툴로 데칼을 테스트한다면,
    맵툴에서 바닥면을 하나 만들어 둔뒤,
    (이 때의 바닥면은 데칼이 제대로 올라가는지를 보기위한 것입니다,)
    데칼박스를 이 바닥에 놓고, ( 이 때 데칼박스의 정점값은 -0.5 ~ 0.5 ) 여야 합니다,
    일반적으로는 매우 작지요,
    작기 때문에, 데칼박스를 스케일시켜 줍니다 ( 적당한 크기로 )
    *본문의 이미지에 보시면,
    바닥에 데칼박스를 놓고 테스트하고 있지요,
    제 엔진에서는 0.5 의 값은 매우 작은 값이기 때문에, 맵툴에서 데칼을 놓고, 스케일로 키운 것입니다,

    데칼박스는 일반 오브젝트와 똑같은 개념입니다,
    맵에 놓이는 것이므로,
    자신만의 월드 매트릭스 ( 회전 * 스케일 * 위치 변환이 모두 포함된 ) 가
    당연히 있을것이구요,

    본문에 설명된대로,
    SSD 연산을 위해서,
    미리 inv 매트릭스를 구해두던지,
    쉐이더에서 구하던지해서,
    로컬영역으로 다시 변환시키게 됩니다

    2018.02.11 16:00 신고
  19.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    부가 설명드리자면,

    집이 있고, 옆에 나무가 있고, 앞에 사람이 있다고 한다면,
    각각의 것들은 각각의 월드매트릭스를 가지고 있겠지요,

    (게임에서는, 회전, 스케일 모두 사용하기 때문에 )
    각각의 것들은 자신만의 회전, 스케일, 위치 가 적용된 매트릭스를 하나씩 가지게 됩니다,
    (자신만의 world 매트릭스)

    집, 나무, 사람 옆에, 데칼박스를 추가했다면,
    당연히, 데칼은 또 자기만의 matWorld 를 가져야 합니다,

    2018.02.11 16:20 신고
    •  Addr  Edit/Del 배우는중

      그럼 제가 이해한게 맞는지 확인을 좀 하고 싶습니다

      일단 변수명은 다음과 같이 두겠습니다.
      1.깊이맵 생성 파일(.fx 불러오는 Effect변수)->CreateDepth
      2.데칼 적용하는 파일(.fx불러오는 Effect 변수)->Apply
      3.데칼 상자->decal
      4.데칼 바를 목표 대상->target
      5.decalWorld, targetWorld(각 메트릭스)

      그럼 우선 만들 경우엔
      CreateDepth->Begin()
      CreateDepth->BeginPass();
      target->drawsubset(0);
      CreateDepth->EndPass();
      CreateDepth->End();
      요 과정을 거치고
      (타겟 메트릭스 및, RightTop 설정 과정 생략)
      Apply->Begin();
      .
      .
      target->drawsubset(0);
      Apply->SetMatrix("월드", decalWorld);
      Apply->SetMatirx("역월드뷰"decalWorldView);
      Apply->CommitChange();
      decal->drawsubset(0);
      .
      .
      요 순으로 가는건가요?
      아니면

      (타겟 메트릭스 및, RightTop 설정 과정 생략)
      Apply->SetMatrix("데칼월드", decalWorld);
      Apply->SetMatirx("데칼역월드뷰"decalWorldView);
      위와 같이 두개의 메트릭스를 쉐이더에서 추가해서 사용하는건가요?
      Apply->Begin();
      .
      .
      target->drawsubset(0);
      Apply->CommitChange();
      decal->drawsubset(0);
      .
      .

      2018.02.11 17:07 신고
  20.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    배우는중님 죄송하지만,,,,

    하아,,,,
    지금 dx 샘플 코드로, 테스트 하시는것 같은데,
    렌더링 구성이랄까, 변수 적용범위 랄까,
    쉐이더 작동 flow,
    특히, 매트릭스 사용,
    이런 것이 제대로 파악이 안되신다면,,,,,

    이것은 그냥,,,
    쉐이더 관련 이론, 렌더링 이론,
    기타 여러가지로 기초가 부족하다라고 밖에는,
    판단이 안되는군요,

    지금 제가 볼때는
    데칼구현이 문제가 아니라,,,
    좀더 기초를 쌓으시는것이 주요한!
    부분일듯 합니다만

    혹시, 게임 프로그래밍 관련 책들은 좀 읽어보셨나요?
    몇가지 도움될만한 책들은 제가 추천드릴수 있구요,
    (이론 공부가 좀더 필요하실듯해서...)

    지금 질문 주시는 것으로는,
    제가 볼때는
    끝이 없을것 같애요,,,하아,,,,,

    배우는 중 이시니까,
    단편적으로, 기술구현에 집중하기 보다는,
    (잘 이해안되는 상태에서, 대충 구현한 것은,
    사실, 아무짝에도 쓸모가 없습니다,
    화려한 기술 구현보다는,
    탄탄하게 쌓인 기초가 당연히 선호도가 높구요, 취업할때도)

    하나하나 이해해 가면서,
    기본 실력을 쌓하가시는 것이 도움이 될듯 보입니다,

    *구현 못했다고, 전혀, 기죽을 필요도 없구요, (아무것도 아닙니다, 이런것은)
    방향을 잘 잡아서, 커가는 것이 중요하다는 이야기 이지요 ^^

    -> 여담이지만,
    오늘 제가 진짜 멋진 이야기 하나 한것 같네요, 이건 진짜 포인트를 잘잡은 이야기 입니다,
    (어디서 쉽게 들으실수 없을 겁니다)

    2018.02.11 18:35 신고
    •  Addr  Edit/Del 배우는중

      감사합니다.

      dx 관련으로는 용책, 해골책을 통해서 꾸준히 공부했었고 다만, 쉐이더 자체는 이번이 처음이라 김포프님께서 쓰신 입문 책 보면서 공부하면서 이것저것 건드려본 것이 전부입니다.
      다만, 이번처럼 메쉬가 두개가 동시에 하나의 코드에 들어가야 하는 듯한 느낌의 것은 처음이라서 혼동이 와서 여쭤본 것이구요.

      dx코드만 사용해서 맵툴이나 파티클 같은 시스템의 구현도 해봤고 애니메이션 같은 부분은 다 건드려봤습니다.

      아무래도 쉐이더가 좀 처음인데다가 이걸로 이것 저것 멘붕이 터지다보니 의심가는건 좀 닥치는대로 물어봤던듯 합니다.

      시간 빼앗아서 죄송합니다.

      p.s:실상 제가 멘붕 터진뒤에 좀 쉬면서 떠오른 건데 결국 데칼의 상자에 대한 POSITION 값을 넘길 방법을 떠올리지 못해서 원인이 이상하게 나왔던듯 합니다.(혹시나 해서 데칼 박스의 깊이맵을 만들고 데칼 박스에다가 데칼을 적용시키는 코드를 그대로 입력했더니 나오기는 하더군요.(문제는 여전히 존재했고, 할 수 밖에 없었지만..)) 아무래도 쉐이더에 대한 지식이 부족하다보니 이래저래 귀찮게 해드린거 같습니다. 다시한번 죄송하다는 말씀 드리며 물러나겠습니다.

      2018.02.11 19:21 신고
  21.  Addr  Edit/Del  Reply Favicon of http://bkjcr.tistory.com BlogIcon 비케이제이

    앗, 그렇군요,
    ㅎㅎ
    쉐이더 사용법만 좀 익숙해지시면, 곧 완료하실수 있으실 겁니다,
    열심히 하시는 모습이 보기좋습니다! ^^

    참고로,
    메쉬가 여러개일때 렌더링할때는,
    대략,

    for( 메쉬갯수만큼 )
    {
    setvalue
    -> 매트릭스, 기타 메쉬전용변수들
    -> 텍스쳐

    if( decal )
    {
    setvalue
    -> inv 매트릭스 추가로 넘겨주고,
    }

    settechniq()
    begin
    draw 메쉬
    end
    }

    쉐이더변수는 왠만큼 만들어도 잘 돌아가니, 필요한것은 바로 추가로 만들어주시고 사용하시면 편할것입니다,

    쉐이더 코드도,
    decal 용 코드를 분리해서,
    한 fx 파일에서, technique 로 분리,

    예를들어,
    일반, 렌더링때는 settechniq( orig )
    (단어가 틀렸을수 있습니다,,,,)

    데칼 렌더링때는 settechniq ( decal )

    뭐, 요렇게 사용하시면, 편리할듯 하네요,

    그럼 수고하시구요~ ^^

    2018.02.11 19:57 신고