首页 > 其他分享 >Unity3D学习笔记12——渲染纹理

Unity3D学习笔记12——渲染纹理

时间:2022-08-20 12:12:08浏览次数:94  
标签:Unity3D 12 渲染 uv vertex 纹理 相机 镜面

目录

1. 概述

在文章《Unity3D学习笔记11——后处理》中论述了后处理是帧缓存(Framebuffer)技术实现之一;而另外一个帧缓存技术实现就是渲染纹理了。通常来说,我们渲染的场景会直接显示到屏幕的颜色缓冲区,但其实纹理和屏幕一样都是二维的,通过把场景渲染到纹理,可以实现很多特别的三维应用场景。三维渲染引擎中,通常给相机封装一个渲染目标(Render Target)的接口,如果不设置,就渲染到屏幕;如果将其设置成一个纹理对象,就渲染到纹理。

2. 详论

一个渲染纹理的例子是镜面效果。镜面效果的原理是,在正常渲染场景之外,额外再离屏渲染一张纹理图,渲染的内容是镜面面前的场景;然后,将这个渲染纹理传递到镜面物体上,左右颠倒绘制出来。

案例非常简单,甚至不需要脚本。首先我们创建一个quad网格作为镜面,并且在镜面前放置一些三维物体:
imglink1

然后创建一张渲染纹理:
imglink2

接着在场景中创建渲染到纹理的相机。将相机的渲染目标设置成刚刚创建的渲染纹理,同时也应该调整相机的位置和旋转,使其于观察方向相反:
imglink4

修改镜面物体上的材质,使其调用的Shader为:

Shader "Custom/Mirrior"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
   
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;    
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
                o.uv.x = 1 - o.uv.x;
         
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);         
                return col;
            }
            ENDCG
        }
    }
}

Shader的内容非常简单,给Shader传入渲染纹理,给横向的纹理坐标取反,最后得到一个左右颠倒的效果图:
imglink3

3. 问题

大部分介绍渲染纹理的文章,基本上都是这个案例。但是我觉得这个只是略具意思而已。

  1. 单从案例本身来说,渲染纹理需要相机的支持,但相机的位置和旋转影像最终镜面的效果。当然我们可以根据实际的效果来调整,但最好根据镜面的成像原理算出合理的参数。
  2. 渲染纹理实际上是通过相机把场景又给渲染了一遍。渲染批次加倍,所以渲染纹理往往是比较耗费性能的。有时需要控制一些物体进入镜面,一些物体不用进入,那么就要用到Unity的Layer(图层)设置了。

代码地址

标签:Unity3D,12,渲染,uv,vertex,纹理,相机,镜面
From: https://www.cnblogs.com/charlee44/p/16607487.html

相关文章

  • SIC 模块FF08MR12W1MA1B11ABPSA1 150A 1200V /FF08MR12W1MA1B11概述
    概述FF08MR12W1MA1B111200VCoolSiC™模块是碳化硅(SiC)MOSFET模块,具有较高的效率和系统灵活性。这些模块采用近阈值电路(NTC)和PressFIT触点技术。该款CoolSiC模块具......
  • 12332
    publicclasstest_payload{publicstaticvoidmain(String[]args){Stringtext="{\"@type\":\"Lcom.sun.org.apache.xalan.internal.xsltc.trax.Temp......
  • 123213
    packageaction;importcom.opensymphony.xwork2.Action;publicclassHelloWorldActionimplementsAction{//请求中传递的参数和返回给页面的值都定义成属性......
  • Java SE 12 新增特性
    JavaSE12新增特性作者:Grey原文地址:JavaSE12新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresString类中新增的APIJavaSE......
  • uleb128编码的解析
    uleb128编码,是一种可变长度的编码,长度大小为1-5字节。uleb128通过字节的最高位来决定是否用到下一个字节。如果最高位为1,则用到下一个字节,直到某个字节最高位为0或已经读......
  • 123213
    packageaction;importcom.opensymphony.xwork2.Action;publicclassHelloWorldActionimplementsAction{//请求中传递的参数和返回给页面的值都定义成属性......
  • 吴恩达机器学习笔记|(12)应用实例-照片OCR
    介绍一个复杂的机器学习系统如何组成一、照片光学字符识别(PhotoOpticalCharacterRecognition,photoOCR)如查找图片时,输入照片上存在的词语就可以将该照片搜索出来。......
  • Educational Codeforces Round 117 (Rated for Div. 2) CF1612
    https://codeforces.com/contest/1612VP过了A~E,感觉海星。F,G这几天补。主要是luogu有翻译拯救了英语不好的我。A一眼\(x+y\equiv0\pmod{2}\),否则无解。那么显......
  • 你所需要了解的几种纹理压缩格式原理
    本文基于资料收集,概括了几种纹理压缩格式的基本思想,希望对于学习有所帮助。为什么我们需要纹理压缩格式?例如R5G6B5、A4R4G4B4、A1R5G5B5、R8G8B8或A8R8G8B8等未经压缩......
  • 1016 [USACO 2012 Dec S]Milk Routing 最短路 忽略部分路径 三个参量
     链接:https://ac.nowcoder.com/acm/contest/26077/1016来源:牛客网题目描述FarmerJohn'sfarmhasanoutdatednetworkofMpipes(1<=......