0529 ubo 접근권한

260529


벌칸으로 셰이더토이를 돌려보려 했다.

float uTime;

매 프레임마다 변하는 time값이 필요해서

UBO에다 넣고 돌렸는데

이렇게 나온다.

0529.png

왜 이런가

하고 1시간동안 머리가 아팠는데

처음애는 정렬 문제인가 하고

alignas(16) 덕지덕지 붙였는데

해결이 안 되었다.


답은 벌칸의 디자인에 있었다.

나는 아직도 이해가 안 가지만,

"UBO 버퍼에 대한 접근 권한"을

세이더 스테이지마다 지정을 할 수 있었다.

아니, 해줘야 했다.

명시를 한 스테이지만 접근이 가능하다.

다음은 Desctiptor Set 레이아웃 정하는 부분이다.

        std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings = {
            // Binding 0 : Vertex shader uniform buffer //vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0),
            // 아니 이걸 검증을 해줘야지 왜 
            //      fs에서 못 읽게 함ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
            vks::initializers::descriptorSetLayoutBinding(
                VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 
                VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, // VS + FS
                0
            ),

            // Binding 1 : Fragment shader image sampler
            vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1)
        };
        VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
        VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));

나는 이해가 안 간다.

아니 저정도로 세부설정을 건드리게 할 거면

저정도는 유효성레이어에서 검증을 해줘야하는 거 아닌가?

이미 컴파일된 바이트코드라도

  1. "FS 에서 해당 UBO를 사용하고 있다."
  2. 그런데 런타임에 'FS 접근권한 없이' UBO를 desc set에다가 바인딩했다.

이정도는 감지할 수 있지 않을까?

validationLayer켰는데도

감지를 못한다.