Texturing

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 Texture

// Declare
ComPtr<ID3D11Texture2D> m_texture;
ComPtr<ID3D11ShaderResourceView> m_textureResourceView;

// Create
AppBase::CreateTexture("crate2_diffuse.png", m_texture,
                        m_textureResourceView);

// Send to Pixel Shader
ID3D11ShaderResourceView *pixelResources[1] = {m_textureResourceView.Get()};
m_context->PSSetShaderResources(0, 1, pixelResources);
  • ID3D11ShaderResourceView : Texture를 shader의 resource view로 사용
    • 하나의 shader에서 render target view에 그린 후 다른 shader에서 resource view로 받아 오는 경우도 존재
  • 일반적으로 여러 개의 texture를 사용하기 때문에 포인터로 한 번에 보내줌


🐥 hlsl

// Declare
ComPtr<ID3D11SamplerState> m_samplerState;

D3D11_SAMPLER_DESC sampDesc;
ZeroMemory(&sampDesc, sizeof(sampDesc));
sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;

// Create
m_device->CreateSamplerState(&sampDesc, m_samplerState.GetAddressOf());


// Send to Pixel Shader
m_context->PSSetSamplers(0, 1, m_samplerState.GetAddressOf());

  • Shaer에서 Texture를 사용할 경우 Sampler도 함께 지정해야 함
  • Filter : interpolation 어떻게 할지
  • Adress U/V/W : texcoord 0~1 넘어가면 어떻게 처리할지 (3차원)
  • Comparison : MipMap간 비교 연산


Address U/V/W

1

CLAMP WRAP MIRROR
2 3 4


🐥 Pixel Shader

// texture, sampler 받아오기
Texture2D g_texture0 : register(t0);
SamplerState g_sampler : register(s0);


float4 main(PixelShaderInput input) : SV_TARGET {
    return = g_texture0.Sample(g_sampler, input.texcoord + float2(xSplit, 0.0));
}
xSplit ySplit
ezgif com-crop (3) ezgif com-crop (2)


조명 효과 내기

float4 main(PixelShaderInput input) : SV_TARGET {
    float x = input.texcoord.x;
    float y = input.texcoord.y;
    
    float f = (x - 0.5 - xSplit) * (x - 0.5 - xSplit) +
             (y - 0.5) * (y - 0.5) -
             0.3 * 0.3;

    float4 color = g_texture0.Sample(g_sampler, input.texcoord);

    if (f < 0.0)
       return color * 1.5;
    else
       return color * 0.3;
}

ezgif com-crop (1)


Texture 2개 사용

float4 main(PixelShaderInput input) : SV_TARGET {
    return input.texcoord.x > xSplit
               ? g_texture0.Sample(g_sampler, input.texcoord)
               : g_texture1.Sample(g_sampler, input.texcoord);
}

ezgif com-crop



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기