UnityShader学习———天空盒,折射,反射

本文深入探讨Unity Shader中的高级纹理技术,包括如何实现立方体纹理的天空盒,以及详细讲解反射和折射的原理和实现。在Unity中,设置正确的Wrap Mode以确保天空盒过渡自然。此外,通过示例代码解释了如何处理视角方向以计算反射和折射,展示OpenGL与UnityShader中的差异,并强调光路的可逆性在折射计算中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高级纹理之立方体纹理

OpenGL中,透视除法是在顶点着色器运行之后执行的,将gl_Position的xyz坐标除以w分量。我们又从深度测试小节中知道,相除结果的z分量等于顶点的深度值。使用这些信息,我们可以将输出位置的z分量等于它的w分量,让z分量永远等于1.0,这样子的话,当透视除法执行之后,z分量会变为w / w = 1.0。

void main()
{
    TexCoords = aPos;
    vec4 pos = projection * view * vec4(aPos, 1.0);
    gl_Position = pos.xyww;
}

这样我们无论怎么移动摄影机,他的距离是永远不变的

我们来看看在UnityShader中是如何做到的吧

首先Unity里自带天空盒材质,只需要把图片贴上即可,同时要注意,天空盒的交界处我们是要过度的自然的,所以我们需要设置图片的Wrap Mode 为 Clamp

创建用于环境映射的阴影纹理

using UnityEngine;
using UnityEditor;
using System.Collections;

public class RenderCubemapWizard : ScriptableWizard {
	
	public Transform renderFromPosition;
	public Cubemap cubemap;
	
	void OnWizardUpdate () {
		helpString = "Select transform to render from and cubemap to render into";
		isValid = (renderFromPosition != null) && (cubemap != null);
	}
	
	void OnWizardCreate () {
		// create temporary camera for rendering
		GameObject go = new GameObject( "CubemapCamera");
		go.AddComponent<Camera>();
		// place it on the object
		go.transform.position = renderFromPosition.position;
		// render into cubemap		
		go.GetComponent<Camera>().RenderToCubemap(cubemap);
		
		// destroy temporary camera
		DestroyImmediate( go );
	}
	
	[MenuItem("GameObject/Render into Cubemap")]
	static void RenderCubemap () {
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
			"Render cubemap", "Render!");
	}
}

脚本动态创建一个摄像机,存此处的环境映射。

反射

反射需要入射光线和法线。

但是无论是opengl还是shader

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值