/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ #ifndef SHADER_PROJECTED_TEX_H #define SHADER_PROJECTED_TEX_H // This shader is used to project a sensors image onto wold space geometry // as if it were projected from the original sensor's point of view in the world. const char vtxShader_projectedTexture[] = "" "#version 300 es \n" "layout(location = 0) in vec4 pos; \n" "uniform mat4 cameraMat; \n" "uniform mat4 projectionMat; \n" "out vec4 projectionSpace; \n" "void main() \n" "{ \n" " gl_Position = cameraMat * pos; \n" " projectionSpace = projectionMat * pos; \n" "} \n"; const char pixShader_projectedTexture[] = "#version 300 es \n" "precision mediump float; \n" "uniform sampler2D tex; \n" "in vec4 projectionSpace; \n" "out vec4 color; \n" "void main() \n" "{ \n" " const vec2 zero = vec2(0.0f, 0.0f); \n" " const vec2 one = vec2(1.0f, 1.0f); \n" " \n" " // Compute perspective correct texture coordinates \n" " // in the sensor map \n" " vec2 cs = projectionSpace.xy / projectionSpace.w; \n" " \n" " // flip the texture! \n" " cs.y = -cs.y; \n" " \n" " // scale from -1/1 clip space to 0/1 uv space \n" " vec2 uv = (cs + 1.0f) * 0.5f; \n" " \n" " // Bail if we don't have a valid projection \n" " if ((projectionSpace.w <= 0.0f) || \n" " any(greaterThan(uv, one)) || \n" " any(lessThan(uv, zero))) { \n" " discard; \n" " } \n" " color = texture(tex, uv); \n" "} \n"; #endif // SHADER_PROJECTED_TEX_H