Unity Shader:Projective Texture Mapping

Projective-Texture-Mapping是用于投影一个texture到一个物体上。通过设置一个摄像机在投影点上,获取投影摄像机的 VP 矩阵,来获取相对于纹理的uv坐标。具体描述见:GPU 编程与CG 语言之阳春白雪下里巴人 中的12.3节。

Shader "Custom/Projective-Texture-Mapping" {
    Properties {
        _Tex ("Proj Tex", 2D) = "white" {}
        _Color ("Main Color", Color) = (1, 1, 1, 1)
        _Ck ("Color Coef", float) = 1
    }
    SubShader {
        Pass {
            CGPROGRAM
            #include "UnityCG.cginc"
            #pragma vertex vert
            #pragma fragment frag

            sampler2D _Tex;
            float4 _Color;
            float _Ck;
            float4x4 _texProjMat;

            struct v2f {
                float4 pos : POSITION;
                float4 shadowUV : TEXCOORD0;
                float3 normal : TEXCOORD1;
                float3 light : TEXCOORD2;
            };

            v2f vert(appdata_base v) {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                float4 worldPos = mul(_Object2World, v.vertex);
                o.shadowUV = mul(_texProjMat, worldPos);
                o.normal = v.normal;
                o.light = ObjSpaceLightDir(v.vertex);

                return o;
            }

            float4 frag(v2f i) : COLOR {
                float nl = dot(i.normal, i.light);

                float2 uv = float2(i.shadowUV.x, i.shadowUV.y) / i.shadowUV.w * 0.5 + 0.5;
                if (uv.x < 0 || uv.x > 1 || uv.y < 0 || uv.y > 1)
                    return _Ck * _Color * max(0, nl);

                float4 t = tex2D(_Tex, uv);

                return _Ck * t * _Color * max(0, nl);
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

效果如下:

该代码并没有考虑到物体的遮挡:plane面上处在cube后面的区域应该是没有纹理的。要做到这个效果,要加上深度比较的过程。

时间: 2024-08-05 08:14:13

Unity Shader:Projective Texture Mapping的相关文章

OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping) (转)

http://blog.csdn.net/zhuyingqingfen/article/details/19331721 分类: GLSL 投影纹理映射 (projective texture mapping):就是把纹理投射到场景的物体上,就像一个投影机把幻灯片投影到其他物体上一样. 如下图:用左边的纹理图像投影到一个茶壶上 投影纹理的实现方法: 其 实最重要的一点就是确定纹理坐标,纹理坐标的确定依赖于物体表面点的相对位置和投影机的位置.在OpenGL中我们可以定义一个camera,我们定义一

Unity Shader:Blur

花了一晚上的时间终于看懂Image Effect中的Blur,其实很简单,就是一下子没有理解到. 原理:使用两个一维[1*7]的高斯滤波模板,一个用在x方向,另一个用在y方向.高斯滤波有模糊的效果. js脚本参数: Down Sample:OnRenderImage中获取的图像进行降采样,其实就是把要处理的纹理变小.有利于加快shader运行速度. Blur Size:在使用高斯模板时,相邻像素点的间隔.越大间隔越远,图像越模糊.但过大的值会导致失真. Blur Iterations:迭代次数,

Projective Texture的原理与实现 【转】

Projective Texture是比较常见的一种技术,实现起来代码也就区区的不过百行,了解其原理及技术细节是我们的重点,知其然,知其所以然. 粗略的说就是想象场景中有台投影仪(Projector),texture就是我们投影的内容,把纹理放在近裁剪面(near clip plane)上,沿着投影仪的方向把纹理投影到场景中.Xheartblue兄翻译了一篇文章,很好的给投影纹理的原理进行的阐述[1],有兴趣阅读原文 的可以访问这里[2],这本书可以是好东东啊!! 在这里有几个概念不能混淆 了:

Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达到需要的效果.一个最常见的流程是. 1)创建一个材质 2)创建一个Unity Shader,并把它赋给上一步创建的材质 3)把材质赋给要渲染的对象 4)在材质面板中调整Unity Shader的属性,以得到满意的效果 下图显示了Unity Shader和材质是如何一起工作来控制物体的渲染的. Uni

Unity shader error: &ldquo;Too many texture interpolators would be used for ForwardBase pass&rdquo;

Unity shader error: "Too many texture interpolators would be used for ForwardBase pass" 解决方法:CGPROGRAM 下加一行:#pragma target 4.0示例如下: Ref: https://www.cnblogs.com/alps/p/7101092.html 原文地址:https://www.cnblogs.com/open-coder/p/12079074.html

Unity shader教程-第一课:写shader和应用shader的流程

这是我们Unity shader(着色器)教程的第一课,在这节课中,你会学到怎么样来用程序来编写一个在Unity中能使用的着色器:漫反射着色器.这节课的内容主要让我们熟悉创建shader和应用shader的流程. 准备工作: 安装Unity版本4.6以上 创建一个新的工程 菜单GameObject | 3D Object | Plane创建出一个平面,作为我们的地面 菜单GameObject | 3D Object | Sphere创建出球来,反复多次创建多个 注意: 1. 创建地面后选中该物体

Unity shader教程-第三课:实践!同一个shader,多个material。

本文首发地址:http://98jy.net/article/18 更多更及时的文章请关于98教育 这节课我们开始利用我们学到的Properties知识来改动代码,用一个shader实现如下图的几个不同的球体: 步骤: 使用MonoDevelop打开shader文件 保证Properties里面是如下内容 _EmissiveColor ("Emissive Color", Color) = (1, 1, 1, 1) _AmbientColor ("Ambient Color&

[Unity] Shader(着色器)输入输出和语义

在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Properties使用color, CG里要用fixed4 如果在Properties使用Range, CG里要用half,实际上描述的是一个float struct Input 用于描述UV坐标的结构体.在 Input 中, 变量名必须是 uv_ 开始, 变量名必须是官方文档中已经指定的名称(也就是说不可

Unity Shader——Writing Surface Shaders(3)——Surface Shader Lighting Examples

Surface Shader 光照例子 这里有一些自定义光照模型和Surface Shaders的例子.通常的Surface Shader例子在这里. 由于延迟光照在某些自定义的逐材质光照模型中表现得并不好,在下面大多数例子中,我们让shader只编译到正向渲染中. 漫反射(Diffuse) 让我们以使用内建Lambert光照模型的shader作为开始吧! Shader "Example/Diffuse Texture" { Properties { _MainTex ("T