立方体贴图shade计算

news2025/1/15 23:24:33

正常的平面贴图是根据mesh顶点找到对应的uv坐标,然后根据重心坐标插值计算三角面内每个点的uv坐标值。最后根据uv坐标值查找平面贴图上的颜色值。
立方体贴图的6个面分别为6张图片,我们怎么根据mesh面上的坐标值来计算对应平面上的uv坐标值。
基本算法是根据原点与mesh面上点坐标(x,y,z)的射线和立方体贴图的交点作为uv坐标。

这里介绍一下uv坐标计算的数学推导过程
直线的表示方程为 p ⃗ = o ⃗ + t d ⃗ \vec{p}=\vec{o}+t\vec{d} p =o +td ,这里 o ⃗ \vec{o} o d ⃗ \vec{d} d 为向量, o ⃗ \vec{o} o 表示起始点,这里为原点; d ⃗ \vec{d} d 表示直线的方向,这里为mesh面上的3维点坐标与原点的方向 n o r m ( ( x , y , z ) − ( 0 , 0 , 0 ) ) = n o r m ( x , y , z ) norm((x,y,z)-(0,0,0))=norm(x,y,z) norm((x,y,z)(0,0,0))=norm(x,y,z);t为需要计算的值。 代入后直线表示方程为 p ⃗ = t ∗ n o r m ( x , y , z ) \vec{p}=t*norm(x,y,z) p =tnorm(x,y,z)
平面的表示方程为 ( p ⃗ − p 0 ⃗ ) ⋅ n ⃗ = 0 (\vec{p}-\vec{p0})\cdot \vec{n}=0 (p p0 )n =0,其中 p ⃗ \vec{p} p 为需要求的点坐标, p 0 ⃗ \vec{p0} p0 为已知的平面上任一点; n ⃗ \vec{n} n 为平面的法向量。 以立方体贴图的右平面举例,其法向量 n ⃗ \vec{n} n 为x轴的方向(1,0,0), p 0 ⃗ \vec{p0} p0 取(1,0,0),代入后平面表示方程为 ( p ⃗ − ( 1 , 0 , 0 ) ) ⋅ ( 1 , 0 , 0 ) = 0 (\vec{p}-(1,0,0))\cdot(1,0,0)=0 (p (1,0,0))(1,0,0)=0
直线与平面的交点表示该点同时满足直线和平面表示方程,将上述两个方程联立,得到
( t ∗ n o r m ( x , y , z ) − ( 1 , 0 , 0 ) ) ⋅ ( 1 , 0 , 0 ) = 0 (t*norm(x,y,z)-(1,0,0))\cdot(1,0,0)=0 (tnorm(x,y,z)(1,0,0))(1,0,0)=0,简化后得 t ∗ x n o r m − 1 = 0 t*xnorm-1=0 txnorm1=0 t = 1 / x n o r m t=1/xnorm t=1/xnorm,其中xnorm表示(x,y,z)归一化后x分量的值。
将t代入直线方程可以得到y,z的坐标为 ynorm/xnorm、znorm/xnorm。因为在右平面上x值都为1,最后的uv坐标值为 ( y n o r m / x n o r m , z n o r m / x n o r m ) (ynorm/xnorm, znorm/xnorm) ynorm/xnorm,znorm/xnorm)
然后再以左平面为例,左平面的法向量 n ⃗ \vec{n} n 为(-1,0,0), p 0 ⃗ \vec{p0} p0 取(-1,0,0),联立方程为 ( t ∗ n o r m ( x , y , z ) − ( − 1 , 0 , 0 ) ) ⋅ ( − 1 , 0 , 0 ) = 0 (t*norm(x,y,z)-(-1,0,0))\cdot(-1,0,0)=0 (tnorm(x,y,z)(1,0,0))(1,0,0)=0,可得 t = − 1 / x n o r m t=-1/xnorm t=1/xnorm,uv坐标值为 ( − y n o r m / x n o r m , − z n o r m / x n o r m ) (-ynorm/xnorm, -znorm/xnorm) (ynorm/xnorm,znorm/xnorm)

综上可得简化后的计算过程如下:
设mesh上坐标点为(x,y,z),取这3个分量中绝对值最大的分量表示位于哪个平面上,然后分别用其他两个分量除以该分量绝对值表示uv坐标。如点(3,-8,-5),表示位于立方体的下方平面上,uv坐标为(3/8,-5/8)
在opengl中我们要根据上述计算过程来实现uv坐标的计算。在unity中有samplerCUBE,可以调用texCUBE用mesh坐标直接从立方体贴图中获取颜色值。代码如下所示,注意mesh的坐标值都是用的物体局部坐标系,不是世界坐标系。

Shader "CubemapSampler"
{
    Properties
    {
        _CubeMap("CubeMap", CUBE) = ""{}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;   
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 vertexLocal : TEXCOORD1;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertexLocal = v.vertex;
                o.vertex = UnityObjectToClipPos(v.vertex);

                return o;
            }

            samplerCUBE _CubeMap;
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = texCUBE(_CubeMap, normalize(i.vertexLocal.xyz));
                return col;
            }
            ENDCG
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法篇-数论】线性筛法(欧拉筛法)筛 n 以内的质数

筛质数1.线性筛法(欧拉筛法)介绍2.欧拉筛法代码以及分析3.总结本文参考自 B站董晓算法 1.线性筛法(欧拉筛法)介绍 我们的目标是筛出 2 ~ n 以内的质数 最最最暴力的方法就是一个数一个数判断是不是质数 但是这样的时间复杂度是非…

【Java第31期】:Spring中存储Bean的注解以及用法

作者:有只小猪飞走了 博客地址:https://blog.csdn.net/m0_62262008?typeblog 这期内容:揭开Bean存储的神秘面纱 文章目录前言一,Controller(控制存储)二,Service(服务存储&#xff…

过拟合问题(机器学习)

训练误差代表分类方法对于现有训练样本集的拟合程度 泛化误差代表此方法的泛化能力,即对于新的样本数据的分类能力如何 模型的训练误差比较高,则称此分类模型欠拟合 模型的训练误差低但是泛化误差比较高,则称此分类模型过拟合 对于欠拟合…

QGIS制作精美地图

QGIS制作精美地图 1.首先新建一个Print Layout,并为其命名(PS:如果创建完不小心删了,点右面的Layout Manager即可~ 2.在右侧空白处,设置页面大小(也可以在空白页面右键——属性) 3.点击Items——Add Map,然后在空白页面框画一个范围,这与ArcGIS pro的操作类似(PS:如…

【UML】类图Class Diagram

1、面向对象 面向对象分析:OOA(Object-Oriented Analysis) 面向对象设计:OOD(Object-Oriented design) 面向对象分析和面向对象设计的核心问题是怎么抽象对象。类图就是用来表示对象,可以表示…

JavaScript 基础1:变量与数据类型及其转换

JavaScript 基础1:变量与数据类型及其转换 Date: September 17, 2022 了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变…

Path.Combine的坑

最近在写一个自动生成代码到指定文件夹的代码需要让玩家指定文件夹紧接着就遇到问题了 可以看到两个路径并没有合并。我查了一下,原来问题是出在总之就是有很多坑。不要用

【USB】macOS usb内核驱动开发入门

文章目录一、环境准备1、背景说明2、SIP是什么?为啥要关闭SI?P3、关闭SIP(intel处理器)4、样例代码下载二、编译运行三、参考资料一、环境准备 不想我啰哩啰嗦的直接跳到第3点开始执行!!! 1、…

维格云轮播组件入门教程

功能简介 维格云轮播组件是对内传达核心价值观、重要通知,对外宣传广告、推广信息的工具。 维格云轮播组件借助在图片中镶嵌链接,并将多张图片循环播放的方式,可让企业的信息更加突出、有效、快捷地传达。 设置步骤 功能入口 【选择任意应用】——【编辑门户】——【轮播…

基于Kubernetes与云原生的存储测试基准CNSBench

CNSBench A Cloud Native Storage Benchmark基础知识CNSBench的摘要与介绍Kubernetes BackgroundKubernetes的工作流程CNSBench提出的需求分析CNSBench设计与实现CNSBench的示意图CNSBench的基准自定义资源基准自定义资源定义基准自定义资源实例基准测试控制器性能测试与实验测…

gcc编译选项

gcc编译步骤 有下面一个源程序 main.c: #include "stdio.h"int main(void) {printf("Hello World !");return 0; }在使用gcc 将 源文件 main.c编译成 可执行目标程序 总共需要4步: 1、源文件 main.c 预处理后,生成mai…

OpenCV-Python小应用(四):红绿灯检测

OpenCV-Python小应用(四):红绿灯检测前言前提条件实验环境红绿灯检测参考文献前言 本文是个人使用OpenCV-Python的应用案例,由于水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入 …

血氧仪方案组成结构设计分析

任何产品都需要外部结构作为载体,将产品使用化的,血氧仪一样。 在血氧仪方案开发中,我们发现,血氧仪仅仅做好电子功能设计,其实根本就不够,没有好的结构件配合,其实要实现功能,那是天…

Nginx入门笔记

目录 Nginx 快速入门 1. 启动,停止和重新加载 Nginx 配置 2. 配置文件的结构 3. 提供静态内容服务(静态网站) 4. 设置简单的代理服务器 5. 设置 FastCGI 代理 Nginx 进程和运行时控制 1. 主进程和工作进程 2. 控制 Nginx Nginx 配置文件 Nginx 配置 Web 服…

Jenkins 构建maven项目时提示:No compiler is provided in this environment.

在确保虚拟机中的maven已经安装且可以正常执行mvn install 的情况下,Jenkins构建时执行maven编译仍然提示 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 首先请确保你的虚拟机上安装了JDK以及Maven&#…

MPU进化,多核异构处理器有多强?A核与M核通信过程解析

内容来源:www.forlinx.com随着市场对嵌入式设备功能需求的提高,市面上出现了集成嵌入式处理器和单片机的主控方案,以兼顾性能和效率。 在实际应用中,嵌入式处理器和单片机之间需要进行大量且频繁的数据交换,如果采用低…

医学图像处理——DeepDrr工具CT生成DRR

医学图像处理——DeepDrr工具CT生成DRR一、DeepDrr工具介绍二、DeepDRR工具使用三、测试DeepDRR工具3.1 测试数据集3.1.1 阿里云数据3.1.2 LIDC-IDRI肺结节dicom数据集3.1.3 LIDC-IDRI肺结节dicom数据集3.2 测试代码四、总结一、DeepDrr工具介绍 它可以将CT数据模拟X射线投影生…

[附源码]SSM计算机毕业设计政府公用车辆管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

VUE全家桶 (Vue-cli、Vue-route、Vuex)学习笔记

Es6 let 是变量2.const 1. 是常量不能修改 创建的时候一定要赋值 要不报错定义的类 里面的属性值可以修改3.对象创建 1.可以先定义const name1; Const a{name}; 输出a的话就是{“name”:1}; 可以直接放进去函数 Const a{ Run(){ }, Set(){ } } 4. 遍历 遍…

【附源码】计算机毕业设计JAVA校园餐厅管理

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…