Shader 21.11.25

김주현·2021년 11월 25일

셰이더

목록 보기
3/18

버퍼위에 텍스처를 올려보자.

셰이더에서 세팅한 렌더스테이츠는 m_pEffect->End()를 호출하면서 꺼진다.(켜지는건 BeginPass())

Begin() 함수가 굉장히 무겁다 같은 셰이더를 사용해서 그릴때는 Begin() 한번만 호출하고 객체를 순회해서 그리면 자원을 절약할수있다.

그런데 이렇게 BeginPass를 할땐 렌더스테이츠가 End()로 꺼지지않는다. 즉 전의 상태가 유지될수있다. 이럴경우엔 패스를 정의할때 다른 패스에서 정의했던 렌더스테이츠들을 어떻게 할지 꼭 정의하자.

텍스처를 올려보자

텍스처는 클라이언트가 가지고 있다 -> 텍스처를 쉐이더로 받아와야한다 -> 전역변수를 이용하자.

texture g_DiffuseTexture; (픽셀들의 어떻게 색을 반사할지를 저장하고있는 데이터이기때문에 Diffuse)

sampler DiffuseSampler = sampler_state
{
// 현재 텍스처를 앞으로 어떻게 사용할것인지를 정의
texture = g_DiffuseTexture;
//현재 텍스쳐가 픽셀들에게 샘플링 될때의 상태를 설정한다.
// 텍스처를 살짝 뭉개면서 전달해줄수있다. 픽셀과 픽셀 사이의 경계가 스무스하게 표현된다.
mipfilter = linear;
magfilter = linear;
aAddressU = clamp;
aAddressV = clamp;

}; ( 초기화한 특수한 데이터를 DiffuseSampler에 대입했다.)

PS_MAIN에서 샘플러로부터 색을 얻어온다는 함수를 작성해주자.

많은 픽셀중에서 어느걸 가져올까? 선형보간을통해 PS_IN으로 들어온 UV좌표.

UV좌표에 해당하는 픽셀을 샘플러로부터 받아오고 출력해준다.

tex2D(
샘플러,
UV좌표,
)

현재 텍스쳐 컴포넌트가 텍스처를 보관하고있다.
셰이더 로드해주는 함수를 구현해보자.

가지고있는 텍스처를 리턴하는 Get_Texture()를 구현해주자.

텍스처는 SetTexture함수로 전달해줄것이다.
SetUp_OnShader(
CShader* pShader,

SetUp_ConstantTable함수를 오버로딩해주자.
{
pTextureCom으로부터 pTexture를 받아오자.

m_pEffect->SetTexture(hHandle,pTexture);

}

-참고-
상수는 Begin()전에 넘겨줘야한다. 어쩔수없게 후에 호출해야되는경우 CommitChange()를 호출해주자.

이제 그리면 아직은 기존의 고정기능과는 달라지지않는다.

흑백으로 만들기

회색은 r,g,b 값이 모두 같다.
컬러값의 gb를 r과 같이 주면 흑백이된다.

지형

Shader_Terrain을 만들어주자.

VS_IN에 NORMAL을 추가해주자.

VS_OUT에 월드포스를 지워주자.

알파블렌딩 필요없고 패스도 필요없다.

셰이더_터레인 완성

로더에서 Shader_Terrain추가해주고
Terrain에 셰이더 컴포넌트를 추가해주자.
지형을 셰이더로 그려보자.

CTerrain::Render()
{
셰이더 VI버퍼 컴포넌트가 nullptr이면 리턴해주자
트랜스폼컨포넌트로 얻어와서 셋업컨스턴트테이블로 월드매트릭스 전달.
파이프라인으로 부터 얻어온 뷰,투영도 전달.
셋업_Texture상수테이블로 텍스처를 전달해주자.
비긴
셰이더().
렌더-VI버퍼().
엔드_셰이더().
}

AddressU,V = clamp 는 1넘는값은 0으로 만든다 wrap이 기본값.
mirror는 1보다크면 다시작아지게

VI버퍼 터레인에서 UV좌표를 20으로 늘려놨다 이럴 필요없다.
이를 셰이더에서 처리해줄수있다.

VS에서 UV좌표를 * 20해서 Out에 넘겨준다

필터

현재 Terrain텍스처를 2개 가져오고있다 이를 쉐이더를 통해 필터를 적용해 2개를 나눠서 출력해보자.

셰이더에 3장 ( 지형용 2장 필터 1장)을 던져줘야한다.

Terrain이 두개의 텍스처 컴포넌트를 가지게 해주자.

거기에 필터를 로드하고 셰이더에 던져줘보자.

셰이더 터레인 수정

필터샘플러를 하나 추가해주자

PS_MAIN에서 tex2D의 값을 벡터에 넣어주자.

필터에 따라서 필터가 흰색인경우엔 소스가 나오고 검정색인경우엔 반대로 해줄수있다.

셰이더에선 벡터와 벡터를 곱하면 각 멤버끼리 곱한값을 넣어준다.

1.f - vFilter 원래는 안되는연산이지만 쉐이더에선 1,f를 벡터로 만들어서 연산을 수행한다.

터레인으로 가서 3장의 텍스처를 던져주자.

현재 한칸한칸 마다 필터가 적용되고있다 -> 지형 전체에 한장만 올라가게 해주고싶다.

20.f 를 소스 데스트에만 적용되게 해주자.

이를 플랫팅 셰이더라고 부른다.

DX9 텍스처를 필터를 만들어줄수있다.

CTerrain의 네컨에서

D3DXCreateTexture()를 호출해주자.

LockRect자료형을 선언해주고 채워준다.

셰이더에 SetUp_TextureConstantTable을 하나 더 추가해주자.

텍스처를 만든 잠시 멤버변수로 바꾸고

네컨에서 다 바꿔주자

다음 렌더에서 바로 텍스처를 받게해주면 바로 사용할수 있다.

셰이더에서 가져올때 리니어로 가져오면 경계가 잘섞인다.

0개의 댓글