Cg Programming/Unity/Billboards广告牌

2024-03-11 09:08

本文主要是介绍Cg Programming/Unity/Billboards广告牌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本教程介绍了广告牌技术
它是基于章节“纹理球体”以及章节“顶点变换”。

广告牌

这里写图片描述
在计算机图形学中,广告牌是变换着的有纹理的矩形,这样它们可以总是跟视平面平行。因此,它们跟高速公路上的广告牌很相似,它们被旋转以达到最佳的可见性。但是,它们跟高速公路上的广告牌又不一样,因为它们会动态旋转以便可以提供最佳的可见性。

广告牌主要的用处在于用二维图像来替换复杂的三维模型。实际上,Unity也会使用广告牌来渲染草。此外,广告牌也通常被用来渲染二维精灵。在以上这两种应用中,至关重要的是广告牌总是跟视平面平行以维持一个三维形状的错觉,虽然只是一个二维的图像被渲染。

广告牌的顶点变换

跟章节“天空盒”类似,我们可以使用默认的立方体物对象来渲染一个广告牌。(要使用默认的四边形(GameObject–>3D Objects–>Quad),你应该在代码中把减号改为加号。对于默认的平面(GameObject– > 3D Objects– > Plane),你应该用z坐标替换y坐标。)基本的想法是用标准模型视图变换UNITY_MATRIX_MV把模型空间的原点(0, 0, 0, 1)变换到观察空间中去。(在齐次坐标系中所有点的第四个坐标都是1;参考章节“顶点变换”中的讨论。)观察空间只是一个世界空间的旋转版本,它的xy平面平行于章节“顶点变换”中讨论的观察平面。于是,我们就有了正确的空间来构造一个适当的旋转广告牌。我们从观察坐标中变换的原点减去x和y对象坐标(vertex.xvertex.y),然后用投影矩阵UNITY_MATRIX_P变换这个结果:

            output.pos = mul(UNITY_MATRIX_P, mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))+ float4(input.vertex.x, input.vertex.y, 0.0, 0.0));

为了让广告牌有不同的尺寸,我们添加着色器属性_ScaleX_ScaleY来缩放对象坐标;于是,代码就变成了这样:

 output.pos = mul(UNITY_MATRIX_P, mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))+ float4(input.vertex.x, input.vertex.y, 0.0, 0.0)* float4(_ScaleX, _ScaleY, 1.0, 1.0));

除此之外,我们只需要设置纹理坐标:

   output.tex = input.tex;

然后片元着色器只在插值纹理坐标中查找颜色。

完整着色器代码

Shader "Cg  shader for billboards" {Properties {_MainTex ("Texture Image", 2D) = "white" {}_ScaleX ("Scale X", Float) = 1.0_ScaleY ("Scale Y", Float) = 1.0}SubShader {Pass {   CGPROGRAM#pragma vertex vert  #pragma fragment frag// User-specified uniforms            uniform sampler2D _MainTex;        uniform float _ScaleX;uniform float _ScaleY;struct vertexInput {float4 vertex : POSITION;float4 tex : TEXCOORD0;};struct vertexOutput {float4 pos : SV_POSITION;float4 tex : TEXCOORD0;};vertexOutput vert(vertexInput input) {vertexOutput output;output.pos = mul(UNITY_MATRIX_P, mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))+ float4(input.vertex.x, input.vertex.y, 0.0, 0.0)* float4(_ScaleX, _ScaleY, 1.0, 1.0));output.tex = input.tex;return output;}float4 frag(vertexOutput input) : COLOR{return tex2D(_MainTex, float2(input.tex.xy));   }ENDCG}}
}

总结

恭喜,你完成了本教程的学习。我们看到了:

  • 为了渲染视图对齐的广告牌,如何变换及映射一个立方体。

扩展阅读

  • 关于对象空间,世界空间,观察空间,模型视图矩阵以及投影矩阵,你应该阅读章节“顶点变换”。
  • 关于纹理映射,你应该阅读章节“纹理球体”。

备注

为了避免渲染某些广告牌时的“闪烁”,必须要在Subshader中添加如下的标记:

Tags { "DisableBatching" = "True" }

译者注:
一些SubShader在使用批处理功能时会合并所有相关模型,并统一变换到世界空间中去,而这些模型的模型空间就会丢失。所以这里要用DisableBatching取消对该SubShader的批处理操作。

这篇关于Cg Programming/Unity/Billboards广告牌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/797363

相关文章

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中,片段着色器(Fragment Shader)是渲染管线中的一个阶段,负责计算屏幕上每个像素(片段)的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行,是决定最终像素颜色的关键步骤。 Fragment Shader的概念: 像素处理:片段着色器处理经过顶点着色器和几何着色器处理后,映射到屏幕空间的像素。颜色计算:它计算每个像素的颜色值,这可能包括纹理采样、光

【Unity Shader】Alpha Blend(Alpha混合)的概念及其使用示例

在Unity和图形编程中,Alpha Blend(也称为Alpha混合)是一种用于处理像素透明度的技术。它允许像素与背景像素融合,从而实现透明或半透明的效果。Alpha Blend在渲染具有透明度的物体(如窗户、玻璃、水、雾等)时非常重要。 Alpha Blend的概念: Alpha值:Alpha值是一个介于0(完全透明)和1(完全不透明)的数值,用于表示像素的透明度。混合模式:Alpha B

Apple - Media Playback Programming Guide

本文翻译整理自:Media Playback Programming Guide(Updated: 2018-01-16 https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/Introduction

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An

Unity 字体创建时候容易导致字体文件不正确的一种情况

上面得到了两种字体格式,一种是TextMeshPro的,另一种是Unity UI系统中默认使用的字体资源。其原因是创建的位置不同导致的。 1.下面是TextMeshPro字体创建的位置 2:下面是Unity UI系统中默认使用的字体资源

摄像头画面显示于unity场景

🐾 个人主页 🐾 🪧阿松爱睡觉,横竖醒不来 🏅你可以不屠龙,但不能不磨剑🗡 目录 一、前言二、UI画面三、显示于场景四、结语 一、前言 由于标题限制,这篇文章主要是讲在unity中调用摄像头,然后将摄像头捕捉到的画面显示到场景中,无论是UI画面还是场景中的某个物体上;至于应用的场景可以用于AR增强现实。 那么话不多说,直接开始今

unity开发 --------- NGUI (UITable)

unity开发 --------- NGUI UITable与UIGrid相似,都是实现自动排序的。但UIGrid的元素大小是由我们来指定的,而Table中的元素的大小是根据元素本身计算出来的。 UITable还保存了元素的顺序List<Transform>。每次重排序,都会更新此List。除了要计算元素的Bound和保存List外,其他基本与UIGrid一致。 unity开发 ---

unity开发 --------- NGUI (UIGrid)

unity开发 --------- NGUI  UIGrid可以实现多个gameobject自动排序。可以设定其排序方向、每个元素的宽度,高度等。 public Arrangement arrangement = Arrangement.Horizontal;public int maxPerLine = 0;public float cellWi

unity开发 --------- NGUI(Localization、UILocalize)

unity开发 --------- NGUI NGUI支持动态加载资源功能。比如语言选择:假如当前语言为中文,当将语言更改为英文时,所有UI上的文字也立即变成了英文。此功能是用Localization和UILocalize两个脚本配合完成的。 Localization中记录多种配置方案,当更改配置方案时,由Localization发送通知,通知各UILocalize更新。 NGU

unity开发 --------- NGUI (UIViewPort、UIDraggableCamera)

unity开发 --------- NGUI 前面提到一种实现ScrollView的方法:unity开发 --------- NGUI (UIDragPanelContents、UIDraggablePanel、UICenterOnChild、UIScollBar、SpringPanel) 但上面那种发放有一个缺陷!它要用到shader。也就是说,对于低端设备,就不能以上面那种方式实现拖