Working version is using
if ((gl_VertexIndex & 1) == 0) {
normal = dir * dir_mats[1];
}else {
normal = dir * dir_mats[0];
}
Crashing version is using
vec2 normal = dir * dir_mats[gl_VertexIndex & 1];
Original
| ; SPIR-V | |
| ; Version: 1.0 | |
| ; Generator: Google Shaderc over Glslang; 7 | |
| ; Bound: 197 | |
| ; Schema: 0 | |
| OpCapability Shader | |
| %2 = OpExtInstImport "GLSL.std.450" | |
| OpMemoryModel Logical GLSL450 | |
| OpEntryPoint Vertex %main "main" %gl_VertexIndex %vertex %color_a %color_b %position_a %position_b %__0 | |
| %1 = OpString "shaders/vertex/debug_lines.vert" | |
| OpSource GLSL 450 %1 "// OpModuleProcessed entry-point main | |
| // OpModuleProcessed client vulkan100 | |
| // OpModuleProcessed target-env vulkan1.0 | |
| // OpModuleProcessed entry-point main | |
| #line 1 | |
| #version 450 | |
| layout(std140, set = 0, binding = 0) uniform ViewArgs { | |
| uniform mat4 proj; | |
| uniform mat4 view; | |
| }; | |
| layout(std140, set = 1, binding = 0) uniform DebugLinesArgs { | |
| uniform vec2 screen_space_thickness; | |
| }; | |
| layout(location = 0) in vec3 position_a; | |
| layout(location = 1) in vec4 color_a; | |
| layout(location = 2) in vec3 position_b; | |
| layout(location = 3) in vec4 color_b; | |
| const mat2 dir_mats[2] = mat2[]( | |
| mat2(0.0, 1.0, -1.0, 0.0), | |
| mat2(0.0, -1.0, 1.0, 0.0) | |
| ); | |
| layout(location = 0) out VertexData { | |
| vec4 color; | |
| } vertex; | |
| void main() { | |
| float factor = float((gl_VertexIndex & 2) >> 1); | |
| vertex.color = mix(color_a, color_b, factor); | |
| mat4 proj_view = proj * view; | |
| vec4 projected_a = proj_view * vec4(position_a, 1.0); | |
| vec4 projected_b = proj_view * vec4(position_b, 1.0); | |
| vec4 proj_current = mix(projected_a, projected_b, factor); | |
| if (proj_current.w < 0) { | |
| // vertex behind camera clip plane | |
| vec4 proj_next = mix(projected_b, projected_a, factor); | |
| vec3 clip_space_dir = normalize(proj_current.xyw - proj_next.xyw); | |
| float coef = -proj_current.w / clip_space_dir.z; | |
| vec3 intersect_pos = proj_current.xyw + (clip_space_dir * coef); | |
| gl_Position = vec4(intersect_pos.x, intersect_pos.y, 0, intersect_pos.z); | |
| } else { | |
| vec2 screen_a = projected_a.xy / projected_a.w; | |
| vec2 screen_b = projected_b.xy / projected_b.w; | |
| vec2 dir = normalize(screen_b - screen_a); | |
| vec2 normal; | |
| if ((gl_VertexIndex & 1) == 0) { | |
| normal = dir * dir_mats[1]; | |
| }else { | |
| normal = dir * dir_mats[0]; | |
| } | |
| // int index = int(gl_VertexIndex & 1); | |
| // vec2 normal = dir * dir_mats[index]; | |
| // vec2 normal = vec2(1.0 ,0.0); | |
| normal *= proj_current.w * screen_space_thickness; | |
| gl_Position = proj_current + vec4(normal, 0.0, 0.0); | |
| } | |
| } | |
| " | |
| OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" | |
| OpSourceExtension "GL_GOOGLE_include_directive" | |
| OpName %main "main" | |
| OpName %gl_VertexIndex "gl_VertexIndex" | |
| OpName %VertexData "VertexData" | |
| OpMemberName %VertexData 0 "color" | |
| OpName %vertex "vertex" | |
| OpName %color_a "color_a" | |
| OpName %color_b "color_b" | |
| OpName %ViewArgs "ViewArgs" | |
| OpMemberName %ViewArgs 0 "proj" | |
| OpMemberName %ViewArgs 1 "view" | |
| OpName %_ "" | |
| OpName %position_a "position_a" | |
| OpName %position_b "position_b" | |
| OpName %gl_PerVertex "gl_PerVertex" | |
| OpMemberName %gl_PerVertex 0 "gl_Position" | |
| OpMemberName %gl_PerVertex 1 "gl_PointSize" | |
| OpMemberName %gl_PerVertex 2 "gl_ClipDistance" | |
| OpMemberName %gl_PerVertex 3 "gl_CullDistance" | |
| OpName %__0 "" | |
| OpName %DebugLinesArgs "DebugLinesArgs" | |
| OpMemberName %DebugLinesArgs 0 "screen_space_thickness" | |
| OpName %__1 "" | |
| OpDecorate %gl_VertexIndex BuiltIn VertexIndex | |
| OpDecorate %VertexData Block | |
| OpDecorate %vertex Location 0 | |
| OpDecorate %color_a Location 1 | |
| OpDecorate %color_b Location 3 | |
| OpMemberDecorate %ViewArgs 0 ColMajor | |
| OpMemberDecorate %ViewArgs 0 Offset 0 | |
| OpMemberDecorate %ViewArgs 0 MatrixStride 16 | |
| OpMemberDecorate %ViewArgs 1 ColMajor | |
| OpMemberDecorate %ViewArgs 1 Offset 64 | |
| OpMemberDecorate %ViewArgs 1 MatrixStride 16 | |
| OpDecorate %ViewArgs Block | |
| OpDecorate %_ DescriptorSet 0 | |
| OpDecorate %_ Binding 0 | |
| OpDecorate %position_a Location 0 | |
| OpDecorate %position_b Location 2 | |
| OpMemberDecorate %gl_PerVertex 0 BuiltIn Position | |
| OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize | |
| OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance | |
| OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance | |
| OpDecorate %gl_PerVertex Block | |
| OpMemberDecorate %DebugLinesArgs 0 Offset 0 | |
| OpDecorate %DebugLinesArgs Block | |
| OpDecorate %__1 DescriptorSet 1 | |
| OpDecorate %__1 Binding 0 | |
| %void = OpTypeVoid | |
| %4 = OpTypeFunction %void | |
| %float = OpTypeFloat 32 | |
| %int = OpTypeInt 32 1 | |
| %_ptr_Input_int = OpTypePointer Input %int | |
| %gl_VertexIndex = OpVariable %_ptr_Input_int Input | |
| %int_2 = OpConstant %int 2 | |
| %int_1 = OpConstant %int 1 | |
| %v4float = OpTypeVector %float 4 | |
| %VertexData = OpTypeStruct %v4float | |
| %_ptr_Output_VertexData = OpTypePointer Output %VertexData | |
| %vertex = OpVariable %_ptr_Output_VertexData Output | |
| %int_0 = OpConstant %int 0 | |
| %_ptr_Input_v4float = OpTypePointer Input %v4float | |
| %color_a = OpVariable %_ptr_Input_v4float Input | |
| %color_b = OpVariable %_ptr_Input_v4float Input | |
| %_ptr_Output_v4float = OpTypePointer Output %v4float | |
| %mat4v4float = OpTypeMatrix %v4float 4 | |
| %ViewArgs = OpTypeStruct %mat4v4float %mat4v4float | |
| %_ptr_Uniform_ViewArgs = OpTypePointer Uniform %ViewArgs | |
| %_ = OpVariable %_ptr_Uniform_ViewArgs Uniform | |
| %_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float | |
| %v3float = OpTypeVector %float 3 | |
| %_ptr_Input_v3float = OpTypePointer Input %v3float | |
| %position_a = OpVariable %_ptr_Input_v3float Input | |
| %float_1 = OpConstant %float 1 | |
| %position_b = OpVariable %_ptr_Input_v3float Input | |
| %uint = OpTypeInt 32 0 | |
| %float_0 = OpConstant %float 0 | |
| %bool = OpTypeBool | |
| %uint_1 = OpConstant %uint 1 | |
| %_arr_float_uint_1 = OpTypeArray %float %uint_1 | |
| %gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1 | |
| %_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex | |
| %__0 = OpVariable %_ptr_Output_gl_PerVertex Output | |
| %v2float = OpTypeVector %float 2 | |
| %mat2v2float = OpTypeMatrix %v2float 2 | |
| %float_n1 = OpConstant %float -1 | |
| %157 = OpConstantComposite %v2float %float_0 %float_n1 | |
| %158 = OpConstantComposite %v2float %float_1 %float_0 | |
| %159 = OpConstantComposite %mat2v2float %157 %158 | |
| %163 = OpConstantComposite %v2float %float_0 %float_1 | |
| %164 = OpConstantComposite %v2float %float_n1 %float_0 | |
| %165 = OpConstantComposite %mat2v2float %163 %164 | |
| %DebugLinesArgs = OpTypeStruct %v2float | |
| %_ptr_Uniform_DebugLinesArgs = OpTypePointer Uniform %DebugLinesArgs | |
| %__1 = OpVariable %_ptr_Uniform_DebugLinesArgs Uniform | |
| %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float | |
| %main = OpFunction %void None %4 | |
| %6 = OpLabel | |
| OpLine %1 27 0 | |
| %13 = OpLoad %int %gl_VertexIndex | |
| %15 = OpBitwiseAnd %int %13 %int_2 | |
| %17 = OpShiftRightArithmetic %int %15 %int_1 | |
| %18 = OpConvertSToF %float %17 | |
| OpLine %1 28 0 | |
| %26 = OpLoad %v4float %color_a | |
| %28 = OpLoad %v4float %color_b | |
| %30 = OpCompositeConstruct %v4float %18 %18 %18 %18 | |
| %31 = OpExtInst %v4float %2 FMix %26 %28 %30 | |
| %33 = OpAccessChain %_ptr_Output_v4float %vertex %int_0 | |
| OpStore %33 %31 | |
| OpLine %1 30 0 | |
| %41 = OpAccessChain %_ptr_Uniform_mat4v4float %_ %int_0 | |
| %42 = OpLoad %mat4v4float %41 | |
| %43 = OpAccessChain %_ptr_Uniform_mat4v4float %_ %int_1 | |
| %44 = OpLoad %mat4v4float %43 | |
| %45 = OpMatrixTimesMatrix %mat4v4float %42 %44 | |
| %52 = OpLoad %v3float %position_a | |
| %54 = OpCompositeExtract %float %52 0 | |
| %55 = OpCompositeExtract %float %52 1 | |
| %56 = OpCompositeExtract %float %52 2 | |
| %57 = OpCompositeConstruct %v4float %54 %55 %56 %float_1 | |
| %58 = OpMatrixTimesVector %v4float %45 %57 | |
| %62 = OpLoad %v3float %position_b | |
| %63 = OpCompositeExtract %float %62 0 | |
| %64 = OpCompositeExtract %float %62 1 | |
| %65 = OpCompositeExtract %float %62 2 | |
| %66 = OpCompositeConstruct %v4float %63 %64 %65 %float_1 | |
| %67 = OpMatrixTimesVector %v4float %45 %66 | |
| %73 = OpExtInst %v4float %2 FMix %58 %67 %30 | |
| %77 = OpCompositeExtract %float %73 3 | |
| %80 = OpFOrdLessThan %bool %77 %float_0 | |
| OpSelectionMerge %82 None | |
| OpBranchConditional %80 %81 %126 | |
| %81 = OpLabel | |
| %88 = OpExtInst %v4float %2 FMix %67 %58 %30 | |
| %92 = OpVectorShuffle %v3float %73 %73 0 1 3 | |
| %94 = OpVectorShuffle %v3float %88 %88 0 1 3 | |
| %95 = OpFSub %v3float %92 %94 | |
| %96 = OpExtInst %v3float %2 Normalize %95 | |
| %100 = OpFNegate %float %77 | |
| %103 = OpCompositeExtract %float %96 2 | |
| %104 = OpFDiv %float %100 %103 | |
| %110 = OpVectorTimesScalar %v3float %96 %104 | |
| %111 = OpFAdd %v3float %92 %110 | |
| %119 = OpCompositeExtract %float %111 0 | |
| %121 = OpCompositeExtract %float %111 1 | |
| %123 = OpCompositeExtract %float %111 2 | |
| %124 = OpCompositeConstruct %v4float %119 %121 %float_0 %123 | |
| %125 = OpAccessChain %_ptr_Output_v4float %__0 %int_0 | |
| OpStore %125 %124 | |
| OpBranch %82 | |
| %126 = OpLabel | |
| %131 = OpVectorShuffle %v2float %58 %58 0 1 | |
| %133 = OpCompositeExtract %float %58 3 | |
| %134 = OpCompositeConstruct %v2float %133 %133 | |
| %135 = OpFDiv %v2float %131 %134 | |
| %138 = OpVectorShuffle %v2float %67 %67 0 1 | |
| %140 = OpCompositeExtract %float %67 3 | |
| %141 = OpCompositeConstruct %v2float %140 %140 | |
| %142 = OpFDiv %v2float %138 %141 | |
| %146 = OpFSub %v2float %142 %135 | |
| %147 = OpExtInst %v2float %2 Normalize %146 | |
| %149 = OpBitwiseAnd %int %13 %int_1 | |
| %150 = OpIEqual %bool %149 %int_0 | |
| OpSelectionMerge %152 None | |
| OpBranchConditional %150 %151 %161 | |
| %151 = OpLabel | |
| %160 = OpVectorTimesMatrix %v2float %147 %159 | |
| OpBranch %152 | |
| %161 = OpLabel | |
| %166 = OpVectorTimesMatrix %v2float %147 %165 | |
| OpBranch %152 | |
| %152 = OpLabel | |
| %196 = OpPhi %v2float %160 %151 %166 %161 | |
| %173 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 | |
| %174 = OpLoad %v2float %173 | |
| %175 = OpVectorTimesScalar %v2float %174 %77 | |
| %177 = OpFMul %v2float %196 %175 | |
| %180 = OpCompositeExtract %float %177 0 | |
| %181 = OpCompositeExtract %float %177 1 | |
| %182 = OpCompositeConstruct %v4float %180 %181 %float_0 %float_0 | |
| %183 = OpFAdd %v4float %73 %182 | |
| %184 = OpAccessChain %_ptr_Output_v4float %__0 %int_0 | |
| OpStore %184 %183 | |
| OpBranch %82 | |
| %82 = OpLabel | |
| OpReturn | |
| OpFunctionEnd |
| ; SPIR-V | |
| ; Version: 1.0 | |
| ; Generator: Google Shaderc over Glslang; 7 | |
| ; Bound: 186 | |
| ; Schema: 0 | |
| OpCapability Shader | |
| %2 = OpExtInstImport "GLSL.std.450" | |
| OpMemoryModel Logical GLSL450 | |
| OpEntryPoint Vertex %main "main" %gl_VertexIndex %vertex %color_a %color_b %position_a %position_b %__0 | |
| %1 = OpString "shaders/vertex/debug_lines.vert" | |
| OpSource GLSL 450 %1 "// OpModuleProcessed entry-point main | |
| // OpModuleProcessed client vulkan100 | |
| // OpModuleProcessed target-env vulkan1.0 | |
| // OpModuleProcessed entry-point main | |
| #line 1 | |
| #version 450 | |
| layout(std140, set = 0, binding = 0) uniform ViewArgs { | |
| uniform mat4 proj; | |
| uniform mat4 view; | |
| }; | |
| layout(std140, set = 1, binding = 0) uniform DebugLinesArgs { | |
| uniform vec2 screen_space_thickness; | |
| }; | |
| layout(location = 0) in vec3 position_a; | |
| layout(location = 1) in vec4 color_a; | |
| layout(location = 2) in vec3 position_b; | |
| layout(location = 3) in vec4 color_b; | |
| const mat2 dir_mats[2] = mat2[]( | |
| mat2(0.0, 1.0, -1.0, 0.0), | |
| mat2(0.0, -1.0, 1.0, 0.0) | |
| ); | |
| layout(location = 0) out VertexData { | |
| vec4 color; | |
| } vertex; | |
| void main() { | |
| float factor = float((gl_VertexIndex & 2) >> 1); | |
| vertex.color = mix(color_a, color_b, factor); | |
| mat4 proj_view = proj * view; | |
| vec4 projected_a = proj_view * vec4(position_a, 1.0); | |
| vec4 projected_b = proj_view * vec4(position_b, 1.0); | |
| vec4 proj_current = mix(projected_a, projected_b, factor); | |
| if (proj_current.w < 0) { | |
| // vertex behind camera clip plane | |
| vec4 proj_next = mix(projected_b, projected_a, factor); | |
| vec3 clip_space_dir = normalize(proj_current.xyw - proj_next.xyw); | |
| float coef = -proj_current.w / clip_space_dir.z; | |
| vec3 intersect_pos = proj_current.xyw + (clip_space_dir * coef); | |
| gl_Position = vec4(intersect_pos.x, intersect_pos.y, 0, intersect_pos.z); | |
| } else { | |
| vec2 screen_a = projected_a.xy / projected_a.w; | |
| vec2 screen_b = projected_b.xy / projected_b.w; | |
| vec2 dir = normalize(screen_b - screen_a); | |
| vec2 normal = dir * dir_mats[gl_VertexIndex & 1]; | |
| // vec2 normal = vec2(1.0 ,0.0); | |
| normal *= proj_current.w * screen_space_thickness; | |
| gl_Position = proj_current + vec4(normal, 0.0, 0.0); | |
| } | |
| } | |
| " | |
| OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" | |
| OpSourceExtension "GL_GOOGLE_include_directive" | |
| OpName %main "main" | |
| OpName %gl_VertexIndex "gl_VertexIndex" | |
| OpName %VertexData "VertexData" | |
| OpMemberName %VertexData 0 "color" | |
| OpName %vertex "vertex" | |
| OpName %color_a "color_a" | |
| OpName %color_b "color_b" | |
| OpName %ViewArgs "ViewArgs" | |
| OpMemberName %ViewArgs 0 "proj" | |
| OpMemberName %ViewArgs 1 "view" | |
| OpName %_ "" | |
| OpName %position_a "position_a" | |
| OpName %position_b "position_b" | |
| OpName %gl_PerVertex "gl_PerVertex" | |
| OpMemberName %gl_PerVertex 0 "gl_Position" | |
| OpMemberName %gl_PerVertex 1 "gl_PointSize" | |
| OpMemberName %gl_PerVertex 2 "gl_ClipDistance" | |
| OpMemberName %gl_PerVertex 3 "gl_CullDistance" | |
| OpName %__0 "" | |
| OpName %indexable "indexable" | |
| OpName %DebugLinesArgs "DebugLinesArgs" | |
| OpMemberName %DebugLinesArgs 0 "screen_space_thickness" | |
| OpName %__1 "" | |
| OpDecorate %gl_VertexIndex BuiltIn VertexIndex | |
| OpDecorate %VertexData Block | |
| OpDecorate %vertex Location 0 | |
| OpDecorate %color_a Location 1 | |
| OpDecorate %color_b Location 3 | |
| OpMemberDecorate %ViewArgs 0 ColMajor | |
| OpMemberDecorate %ViewArgs 0 Offset 0 | |
| OpMemberDecorate %ViewArgs 0 MatrixStride 16 | |
| OpMemberDecorate %ViewArgs 1 ColMajor | |
| OpMemberDecorate %ViewArgs 1 Offset 64 | |
| OpMemberDecorate %ViewArgs 1 MatrixStride 16 | |
| OpDecorate %ViewArgs Block | |
| OpDecorate %_ DescriptorSet 0 | |
| OpDecorate %_ Binding 0 | |
| OpDecorate %position_a Location 0 | |
| OpDecorate %position_b Location 2 | |
| OpMemberDecorate %gl_PerVertex 0 BuiltIn Position | |
| OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize | |
| OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance | |
| OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance | |
| OpDecorate %gl_PerVertex Block | |
| OpMemberDecorate %DebugLinesArgs 0 Offset 0 | |
| OpDecorate %DebugLinesArgs Block | |
| OpDecorate %__1 DescriptorSet 1 | |
| OpDecorate %__1 Binding 0 | |
| %void = OpTypeVoid | |
| %4 = OpTypeFunction %void | |
| %float = OpTypeFloat 32 | |
| %int = OpTypeInt 32 1 | |
| %_ptr_Input_int = OpTypePointer Input %int | |
| %gl_VertexIndex = OpVariable %_ptr_Input_int Input | |
| %int_2 = OpConstant %int 2 | |
| %int_1 = OpConstant %int 1 | |
| %v4float = OpTypeVector %float 4 | |
| %VertexData = OpTypeStruct %v4float | |
| %_ptr_Output_VertexData = OpTypePointer Output %VertexData | |
| %vertex = OpVariable %_ptr_Output_VertexData Output | |
| %int_0 = OpConstant %int 0 | |
| %_ptr_Input_v4float = OpTypePointer Input %v4float | |
| %color_a = OpVariable %_ptr_Input_v4float Input | |
| %color_b = OpVariable %_ptr_Input_v4float Input | |
| %_ptr_Output_v4float = OpTypePointer Output %v4float | |
| %mat4v4float = OpTypeMatrix %v4float 4 | |
| %ViewArgs = OpTypeStruct %mat4v4float %mat4v4float | |
| %_ptr_Uniform_ViewArgs = OpTypePointer Uniform %ViewArgs | |
| %_ = OpVariable %_ptr_Uniform_ViewArgs Uniform | |
| %_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float | |
| %v3float = OpTypeVector %float 3 | |
| %_ptr_Input_v3float = OpTypePointer Input %v3float | |
| %position_a = OpVariable %_ptr_Input_v3float Input | |
| %float_1 = OpConstant %float 1 | |
| %position_b = OpVariable %_ptr_Input_v3float Input | |
| %uint = OpTypeInt 32 0 | |
| %float_0 = OpConstant %float 0 | |
| %bool = OpTypeBool | |
| %uint_2 = OpConstant %uint 2 | |
| %uint_1 = OpConstant %uint 1 | |
| %_arr_float_uint_1 = OpTypeArray %float %uint_1 | |
| %gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1 | |
| %_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex | |
| %__0 = OpVariable %_ptr_Output_gl_PerVertex Output | |
| %v2float = OpTypeVector %float 2 | |
| %mat2v2float = OpTypeMatrix %v2float 2 | |
| %_arr_mat2v2float_uint_2 = OpTypeArray %mat2v2float %uint_2 | |
| %152 = OpConstantComposite %v2float %float_0 %float_1 | |
| %float_n1 = OpConstant %float -1 | |
| %154 = OpConstantComposite %v2float %float_n1 %float_0 | |
| %155 = OpConstantComposite %mat2v2float %152 %154 | |
| %156 = OpConstantComposite %v2float %float_0 %float_n1 | |
| %157 = OpConstantComposite %v2float %float_1 %float_0 | |
| %158 = OpConstantComposite %mat2v2float %156 %157 | |
| %159 = OpConstantComposite %_arr_mat2v2float_uint_2 %155 %158 | |
| %_ptr_Function__arr_mat2v2float_uint_2 = OpTypePointer Function %_arr_mat2v2float_uint_2 | |
| %_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float | |
| %DebugLinesArgs = OpTypeStruct %v2float | |
| %_ptr_Uniform_DebugLinesArgs = OpTypePointer Uniform %DebugLinesArgs | |
| %__1 = OpVariable %_ptr_Uniform_DebugLinesArgs Uniform | |
| %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float | |
| %main = OpFunction %void None %4 | |
| %6 = OpLabel | |
| %indexable = OpVariable %_ptr_Function__arr_mat2v2float_uint_2 Function | |
| OpLine %1 27 0 | |
| %13 = OpLoad %int %gl_VertexIndex | |
| %15 = OpBitwiseAnd %int %13 %int_2 | |
| %17 = OpShiftRightArithmetic %int %15 %int_1 | |
| %18 = OpConvertSToF %float %17 | |
| OpLine %1 28 0 | |
| %26 = OpLoad %v4float %color_a | |
| %28 = OpLoad %v4float %color_b | |
| %30 = OpCompositeConstruct %v4float %18 %18 %18 %18 | |
| %31 = OpExtInst %v4float %2 FMix %26 %28 %30 | |
| %33 = OpAccessChain %_ptr_Output_v4float %vertex %int_0 | |
| OpStore %33 %31 | |
| OpLine %1 30 0 | |
| %41 = OpAccessChain %_ptr_Uniform_mat4v4float %_ %int_0 | |
| %42 = OpLoad %mat4v4float %41 | |
| %43 = OpAccessChain %_ptr_Uniform_mat4v4float %_ %int_1 | |
| %44 = OpLoad %mat4v4float %43 | |
| %45 = OpMatrixTimesMatrix %mat4v4float %42 %44 | |
| %52 = OpLoad %v3float %position_a | |
| %54 = OpCompositeExtract %float %52 0 | |
| %55 = OpCompositeExtract %float %52 1 | |
| %56 = OpCompositeExtract %float %52 2 | |
| %57 = OpCompositeConstruct %v4float %54 %55 %56 %float_1 | |
| %58 = OpMatrixTimesVector %v4float %45 %57 | |
| %62 = OpLoad %v3float %position_b | |
| %63 = OpCompositeExtract %float %62 0 | |
| %64 = OpCompositeExtract %float %62 1 | |
| %65 = OpCompositeExtract %float %62 2 | |
| %66 = OpCompositeConstruct %v4float %63 %64 %65 %float_1 | |
| %67 = OpMatrixTimesVector %v4float %45 %66 | |
| %73 = OpExtInst %v4float %2 FMix %58 %67 %30 | |
| %77 = OpCompositeExtract %float %73 3 | |
| %80 = OpFOrdLessThan %bool %77 %float_0 | |
| OpSelectionMerge %82 None | |
| OpBranchConditional %80 %81 %126 | |
| %81 = OpLabel | |
| %88 = OpExtInst %v4float %2 FMix %67 %58 %30 | |
| %92 = OpVectorShuffle %v3float %73 %73 0 1 3 | |
| %94 = OpVectorShuffle %v3float %88 %88 0 1 3 | |
| %95 = OpFSub %v3float %92 %94 | |
| %96 = OpExtInst %v3float %2 Normalize %95 | |
| %100 = OpFNegate %float %77 | |
| %103 = OpCompositeExtract %float %96 2 | |
| %104 = OpFDiv %float %100 %103 | |
| %110 = OpVectorTimesScalar %v3float %96 %104 | |
| %111 = OpFAdd %v3float %92 %110 | |
| %119 = OpCompositeExtract %float %111 0 | |
| %121 = OpCompositeExtract %float %111 1 | |
| %123 = OpCompositeExtract %float %111 2 | |
| %124 = OpCompositeConstruct %v4float %119 %121 %float_0 %123 | |
| %125 = OpAccessChain %_ptr_Output_v4float %__0 %int_0 | |
| OpStore %125 %124 | |
| OpBranch %82 | |
| %126 = OpLabel | |
| %131 = OpVectorShuffle %v2float %58 %58 0 1 | |
| %133 = OpCompositeExtract %float %58 3 | |
| %134 = OpCompositeConstruct %v2float %133 %133 | |
| %135 = OpFDiv %v2float %131 %134 | |
| %138 = OpVectorShuffle %v2float %67 %67 0 1 | |
| %140 = OpCompositeExtract %float %67 3 | |
| %141 = OpCompositeConstruct %v2float %140 %140 | |
| %142 = OpFDiv %v2float %138 %141 | |
| %146 = OpFSub %v2float %142 %135 | |
| %147 = OpExtInst %v2float %2 Normalize %146 | |
| %161 = OpBitwiseAnd %int %13 %int_1 | |
| OpStore %indexable %159 | |
| %165 = OpAccessChain %_ptr_Function_mat2v2float %indexable %161 | |
| %166 = OpLoad %mat2v2float %165 | |
| %167 = OpVectorTimesMatrix %v2float %147 %166 | |
| %174 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0 | |
| %175 = OpLoad %v2float %174 | |
| %176 = OpVectorTimesScalar %v2float %175 %77 | |
| %178 = OpFMul %v2float %167 %176 | |
| %181 = OpCompositeExtract %float %178 0 | |
| %182 = OpCompositeExtract %float %178 1 | |
| %183 = OpCompositeConstruct %v4float %181 %182 %float_0 %float_0 | |
| %184 = OpFAdd %v4float %73 %183 | |
| %185 = OpAccessChain %_ptr_Output_v4float %__0 %int_0 | |
| OpStore %185 %184 | |
| OpBranch %82 | |
| %82 = OpLabel | |
| OpReturn | |
| OpFunctionEnd |