ShaderLab学习小结(十八)cubemap-程序员宅基地

技术标签: 游戏  

现在还没用到cubemap(除了天空盒子),只是初步的学了一下最简单的cubemap的shader
找一幅图
ShaderLab学习小结(十八)cubemap
好吧,有点大,在unity里把它设置成cubemap
ShaderLab学习小结(十八)cubemap
OK,图有了,看shader,代码挺简单的,其实和普通的2D贴图shader挺像

Shader "Custom/Cubemap" {
    Properties {
        _Cube ("Cubemap", cube) = "" {}             //1.
    }
    SubShader {
        pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "unitycg.cginc"
            #include "Lighting.cginc"

            samplerCUBE _Cube;             //2.

            struct v2f {
                float4 pos:POSITION;
                float3 R:TEXCOORD0;
            };
            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                float3 L= -_WorldSpaceLightPos0.xyz;                       //3.
                float3 N = UnityObjectToWorldNormal(v.normal);
                o.R = reflect(L, N);            //4.
                return o;
            }
            fixed4 frag(v2f IN):COLOR
            {
                fixed4 col = texCUBE(_Cube, IN.R);            //5.
                return col;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
}

注意,以上这段代码是有问题的,后面会指出问题并改正,先以这段代码来说明
按照注释位置

1、2

_Cube ("Cubemap", cube) = "" {}             //1.
samplerCUBE _Cube;             //2.

2D贴图时,Properties里定义的是2d,而变量声明时用的是sampler2D
而对于cubemap来说则是cube和samplerCUBE
注意:samplerCUBE的CUBE大写,就像sampler2D的D大写一样

3、4、5

先看5

fixed4 col = texCUBE(_Cube, IN.R);            //5.

因为按照所学,最后的纹理采样要用到texCUBE这个CG函数,其实看形式和tex2D很像
第一个参数就是我们的cubemap那张图
第二个参数则是在vert程序中计算的一个世界坐标系下的反射向量,float3的
再看4是如何计算这个反射的

o.R = reflect(L, N);            //4.

反射吗,当然是光和法线,而这个L,是光的入射,即从光源指向顶点
reflect函数是计算反射向量的
所以看3

float3 L= -_WorldSpaceLightPos0.xyz;                       //3.

以前用到这个世界坐标空间下的光方向_WorldSpaceLightPos0.xyz,这个是从顶点指向光源的方向,现在正好相反,所以取负

貌似OK了,我们看看结果,在场景中建一个球体,把这个材质赋给它,并转动视角
ShaderLab学习小结(十八)cubemap
其实也不能说错了,如果就是要这个效果的话
用光与法线算出来的反射,因为光是平行光固定的,顶点法线也是固定的,反射也是固定的
所以算出来的颜色是固定,就有了这个效果
但如果想实现的是像镜面那种效果的话,随着视角的不同,看到的东西并不相同,代码就要做些修改了
既然是随视角变化,那是不是认为不要用光的方向而是用视方向
我们把注释的3和4改一下

float3 V = -WorldSpaceViewDir(v.vertex);    //3.
o.R = reflect(V, N);    //4.

这里用了视方向,同样是从眼睛指向顶点,所以也取负
再用reflect函数
看下效果
ShaderLab学习小结(十八)cubemap

转载于:https://blog.51cto.com/shuxiayeshou/2071035

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33843409/article/details/92359957

智能推荐

毕设项目:监考安排与查询系统(JSP+java+springmvc+mysql+MyBatis)_监考排班系统源码-程序员宅基地

文章浏览阅读204次。该系统旨在通过自动化、智能化的方式,实现对考试过程中监考人员的排班、考务信息的发布以及考生成绩的查询等功能。同时,监考安排与查询系统的实施还有助于加强学校与社会的互动,提升教育管理水平。+ Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。前端展示结果:前端接收到后端返回的数据,根据需要进行展示。后端程序接收到请求后,根据请求的类型和参数进行相应的处理。_监考排班系统源码

2024年最新Android面试精讲,附小技巧,快手android面试经验-程序员宅基地

文章浏览阅读254次,点赞3次,收藏3次。其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Android学习PDF+学习视频+面试文档+知识点笔记【Android思维脑图(技能树)】知识不体系。

《书生·浦语大模型实战营》第四节课《XTuner 微调 LLM:1.8B、多模态、Agent》课程笔记-程序员宅基地

文章浏览阅读523次,点赞16次,收藏20次。2024年3月开始参加《书生·浦语大模型实战营》第一节课《书生·浦语大模型全链路开源体系》第二节课《轻松玩转书生·浦语大模型趣味 Demo》第三节课《茴香豆:搭建你的 RAG 智能助理》第五节课《LMDeploy 量化部署 LLM 实践》这是《书生·浦语大模型实战营》第四节课《XTuner 微调 LLM:1.8B、多模态、Agent》课程笔记想利用底座模型应用到自己的特定领域当中,应用到一个特定的下游任务当中,表现是不如针对领域内训练的模型,所以需要进行领域内微调。

Matlab仿真偶极子天线激励_天线matlab吸收边界条件-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏25次。%文件描述:三维偶极子源激励,PML吸收边界,采用矩阵赋值%激励描述:高斯脉冲%激励位置:空间中心位置%介质描述:自由空间clear all;close all;clc;%设置初始条件NSTEPS=80;%时间步IE=40;JE=40;KE=40;%仿真空间大小ic=IE/2;jc=JE/2;kc=KE/2;%观察点位置ra_y=1.0;ra_x=1.0;%方向比例系数nx..._天线matlab吸收边界条件

计算机毕业设计hadoop+spark+hive汽车评价情感分析 新能源汽车推荐系统 汽车数据分析可视化 新能源汽车推荐系统 汽车爬虫 机器学习 深度学习 人工智能 知识图谱 大数据毕业设计-程序员宅基地

文章浏览阅读783次,点赞19次,收藏9次。计算机毕业设计hadoop+spark+hive汽车评价情感分析 新能源汽车推荐系统 汽车数据分析可视化 新能源汽车推荐系统 汽车爬虫 机器学习 深度学习 人工智能 知识图谱 大数据毕业设计

论文复现——PFLD——人脸关键点检测_pfld人臉關鍵點檢測-程序员宅基地

文章浏览阅读5.2k次,点赞21次,收藏92次。PFLD:A Pratical Facial Landmark Detector论文下载1. 网络简介人脸关键点检测任务是很多人脸相关任务的基础,比如换脸、人脸变换、人脸识别等等;现实中,人脸通常暴露在复杂环境中,同样的人脸图像可能因为姿势、表情、光线以及遮挡等问题而非常不同。采集同一个人在不同环境不同姿势情况下的数据集理论上可行,但是实际操作很难实现,因为所需的训练数据量太大了。作者总结了人脸关键点问题的四个难点:局部变量影响(Local Variation):表情、局部光照、阴_pfld人臉關鍵點檢測

随便推点

gbdt的参数意义与设置_gbdt训练精度主要跟什么参数有关-程序员宅基地

文章浏览阅读5.6k次。http://www.jianshu.com/p/005a4e6ac775重要参数的意义及设置推荐GBDT树的深度:6;(横向比较:DecisionTree/RandomForest需要把树的深度调到15或更高)  以下摘自知乎上的一个问答(详见参考文献8),问题和回复都很好的阐述了这个参数设置的数学原理。  【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的_gbdt训练精度主要跟什么参数有关

为什么前端数值精度会丢失?(BigInt解决办法)_前端精度丢失问题-程序员宅基地

文章浏览阅读1.9k次。数值计算、保留指定小数位、接口返回数值过大等等,这些操作都有可能导致原本正常的数值在JavaScript中确表现得异常(即精度丢失)。使用整数进行计算(先放大再缩小)。在处理需要高精度计算的场景中,可以使用一些专门的库或工具。例如,JavaScript中的Decimal.js、Big.js或BigNumber.js等库提供了高精度的数学计算功能,可以避免精度丢失的问题。超过最值时,接口以字符串的形式返回对应的值。_前端精度丢失问题

python123程序设计方法学_嵩天老师Python123 测验8: 程序设计方法学 (第8周)-程序员宅基地

文章浏览阅读374次。文章目录单项选择题程序设计题英文字符的鲁棒输入数字的鲁棒输入单项选择题点击选项选择正确答案,每题有且仅有一个正确答案1.关于Python第三方库安装方法,以下选项描述错误的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬A. 使用pip命令B. 访问U..._嵩天第八周答案csdn

3 行代码写出 8 个接口,开挂了?网友:绝对不可能!!!-程序员宅基地

文章浏览阅读187次。点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方留言必回,有问必答!每天08:35更新文章,每天进步一点点...肯定有不少人会想:这怎么可能呢?就算用几乎...

CNN卷积层神经元数量、连接数量、权重数量的计算_输入层神经元数量-程序员宅基地

文章浏览阅读2.8w次,点赞10次,收藏53次。1. 神经元的数量:和输入层类似,输出维度是多少,神经元就有多少feature map大小 * feature map数量2. 连接数量:全连接:输入层神经元数量*输出层神经元数量CNN局部连接: 故由于局部连接机制,卷积层的连接数为:局部连接的输入层神经元数*卷积层神经元数以alexnet为例:在第一个卷积层,神经元使用的感受野尺寸F=_输入层神经元数量

解决Android studio呈卡死的现象_android studio 打開時進度卡主-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏3次。AS卡死问题修复_android studio 打開時進度卡主