티스토리 뷰

반응형

[1] MTLSamplerState

texture가 어떻게 샘플링되어야하는 지를 정의하는 객체이다. (여기 예제에서는 texture를 input image라고 생각하면 됨)

 

MTLDevice의 아래 함수를 통해 만들 수 있다.

func makeSamplerState(descriptor: MTLSamplerDescriptor) -> MTLSamplerState?

 

(메탈에서는 pipleline, sampler에 해당하는 클래스 이름에 State를 붙여서 MTLPipelineState, MTLSamplerState 라고 한다. 왜지..?)

 

아래에서는 descriptor를 알아보자-!!

 

[2] MTLSamplerDescriptor

 

descriptor를 만들고 descriptor의 프로터피들을 세팅한다. 

그 descriptor로 sampler를 만든다.

 

    private func makeSamplerState() -> MTLSamplerState {
        let descriptor = MTLSamplerDescriptor()
        descriptor.sAddressMode = .repeat // .clampToEdge, .mirrorRepeat, .clampToZero
        descriptor.tAddressMode = .repeat // .clampToEdge, .mirrorRepeat, .clampToZero
        
        descriptor.magFilter = .linear // .nearest
        descriptor.minFilter = .linear // .nearest

        return device.makeSamplerState(descriptor: descriptor)!
    }

 

그럼 각 프로퍼티들을 자세히 알아보자..!!

 

 

[2.1]  rAddressMode, sAddressMode, tAddressMode

 

 

이미지 샘플링할 것이니까 width(sAddressMode)와 , height(tAddressMode)를 사용할 것이다.

 

우선 MTLAddressMode의 종류는 아래와 같다. 

 

r,s,t address mode 모두 디폴트 값이 MTLSamplerAddressMode.clampToEdge 이다. 

 

 

1) clampToEdge

 

0과 1 사이의 좌표를 고정한다. 결과적으로 큰 좌표가 가장자리에 고정되어 가장자리의 패턴이 늘어나게 된다.

 

let descriptor = MTLSamplerDescriptor()
descriptor.sAddressMode = .clampToEdge 
descriptor.tAddressMode = .clampToEdge

 

 

 

2) clampToZero

 

무슨말인지 모르겠음ㅠㅠ

 

let descriptor = MTLSamplerDescriptor()
descriptor.sAddressMode = .clampToZero
descriptor.tAddressMode = .clampToZero

 

 

3) repeat

let descriptor = MTLSamplerDescriptor()
descriptor.sAddressMode = .repeat
descriptor.tAddressMode = .repeat

 

4) mirrorRepeat

let descriptor = MTLSamplerDescriptor()
descriptor.sAddressMode = .mirrorRepeat
descriptor.tAddressMode = .mirrorRepeat

 

 

 

 

 

Metal by Tutorials 에 있는 그림 첨부!

 

[2.2] magFilter, minFilter 

 

magFilter는 확대할때, minFilter는 축소할때 설정이다.

nearest, linear를 선택할 수 있으며

두개 다 기본 값은  MTLSamplerMinMagFilter.nearest 이다. 

 

 

 

이것은 바꾸고 돌려봐도 차이를 잘모르겠어서 이 블로그 에서 사진을 캡쳐해서 첨부한다-!! 

 

https://heinleinsgame.tistory.com/9?category=757483

 

 

 

[Metal Fragmnet Shader에 sampler 넘기는 법]

fragment shader를 이렇게 만들어준다.

inputTexture는 샘플링할 것이니까 access권한을 sample로 해줘야한다.

(참고로 저 data는 vertexShader 설명이 필요해서 무시해주세용..)

 

그리고 inputTexture랑 방금 만든 samplerState를 설정해주면 끝-!

 

 

 

[Reference]

 

heinleinsgame.tistory.com/9?category=757483

 

[Learn OpenGL 번역] 2-6. 시작하기 - Textures

Textures 시작하기/Textures 객체에 더 많은 상세사항을 추가하기 위해 각 vertex에 컬러를 사용하여 흥미로운 이미지를 만들 수 있음을 배웠습니다. 하지만 사실적인 느낌을 얻기 위해서는 많은 vertex�

heinleinsgame.tistory.com

 

반응형
댓글