Select Git revision
default_vertex_shader_source.cpp
default_vertex_shader_source.cpp 2.51 KiB
//------------------------------------------------------------------------------
// Project Phoenix
//
// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
// Virtual Reality & Immersive Visualization Group.
//------------------------------------------------------------------------------
// License
//
// Licensed under the 3-Clause BSD License (the "License");
// you may not use this file except in compliance with the License.
// See the file LICENSE for the full text.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//------------------------------------------------------------------------------
#include "phx/default_vertex_shader_source.hpp"
#include <string>
namespace phx {
std::string default_vertex_shader_source = R"(
#version 450
#ifdef VULKAN
#else
#extension GL_ARB_explicit_attrib_location : enable
#endif
struct _transform
{
mat4 model ;
};
struct _camera
{
mat4 view ;
mat4 projection;
};
layout(std430, binding = 0) readonly buffer transform
{
uvec4 transforms_metadata; // x size
_transform transforms[];
};
layout(std430, binding = 2) readonly buffer camera
{
uvec4 cameras_metadata; // x size, y index
_camera cameras [];
};
layout(location = 0) in vec3 vertex;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texture_coordinate;
layout(location = 3) in uvec2 instance_attribute; // x transform id, y material id
layout(location = 0) out vs_output_type
{
vec3 vertex ;
vec3 normal ;
vec2 texture_coordinate;
flat uint material_index ;
} vs_output;
#ifdef VULKAN
out gl_PerVertex
{
vec4 gl_Position;
};
#endif
void main()
{
mat4 model_view = cameras[cameras_metadata.y].view * transforms[instance_attribute.x].model;
vec4 trans_vertex = model_view * vec4(vertex, 1.0);
vs_output.vertex = trans_vertex.xyz;
vs_output.normal = normalize((model_view * vec4(normal, 0.0f)).xyz);
vs_output.texture_coordinate = texture_coordinate;
vs_output.material_index = instance_attribute.y;
gl_Position = cameras[cameras_metadata.y].projection * trans_vertex;
}
)";
} // namespace phx