3D编程:Spotlights

Spotlights

一个spotlight是一个directional light和point light的组合。在world space中有一个坐标位置,但是光线只能照射到某个特定方向。另外,spotlight与point light一样,也是根据距离而衰减,但spotlight还会围绕光线的原始方向而衰减。可以把spotlight看作一个虚拟的手电筒,形成一个focus beam(聚焦光束)随着光线距离光源中心越远而衰减。

模拟一个spotlight,需要一个坐标位置,方向,辐射半径,颜色和强度,以及用于描述focus beam辐射范围的inner和outer角度的浮点值。图7.4描述了这些元素。

图7.4 An illustration of a spotlight.

列表7.3列出了一种简单的spotlight effect的代码。与之前一样,把该代码拷贝到NVIDIA FX Composer中。接下来将详细讲解这些代码。

列表7.3 Spotlight.fx

#include "include\\Common.fxh"

/************* Resources *************/

cbuffer CBufferPerFrame
{
	float4 AmbientColor : AMBIENT <
		string UIName =  "Ambient Light";
		string UIWidget = "Color";
	> = {1.0f, 1.0f, 1.0f, 0.0f};

	float4 LightColor : COLOR <
		string Object = "LightColor0";
		string UIName =  "Spot Light Color";
		string UIWidget = "Color";
	> = {1.0f, 1.0f, 1.0f, 1.0f};

	float3 LightPosition : POSITION <
		string Object = "SpotLightPosition0";
		string UIName =  "Spot Light Position";
		string Space = "World";
	> = {0.0f, 0.0f, 0.0f};

	float3 LightLookAt : DIRECTION <
		string Object = "SpotLightDirection0";
		string UIName =  "Spot Light Direction";
		string Space = "World";
	> = {0.0f, 0.0f, -1.0f};

	float LightRadius <
		string UIName =  "Spot Light Radius";
		string UIWidget = "slider";
		float UIMin = 0.0;
		float UIMax = 100.0;
		float UIStep = 1.0;
	> = {10.0f};

	float SpotLightInnerAngle <
		string UIName =  "Spot Light Inner Angle";
		string UIWidget = "slider";
		float UIMin = 0.5;
		float UIMax = 1.0;
		float UIStep = 0.01;
	> = {0.75f};

	float SpotLightOuterAngle <
		string UIName =  "Spot Light Outer Angle";
		string UIWidget = "slider";
		float UIMin = 0.0;
		float UIMax = 0.5;
		float UIStep = 0.01;
	> = {0.25f};

	float3 CameraPosition : CAMERAPOSITION < string UIWidget="None"; >;
}

cbuffer CBufferPerObject
{
	float4x4 WorldViewProjection : WORLDVIEWPROJECTION < string UIWidget="None"; >;
	float4x4 World : WORLD < string UIWidget="None"; >;

	float4 SpecularColor : SPECULAR <
		string UIName =  "Specular Color";
		string UIWidget = "Color";
	> = {1.0f, 1.0f, 1.0f, 1.0f};

	float SpecularPower : SPECULARPOWER <
		string UIName =  "Specular Power";
		string UIWidget = "slider";
		float UIMin = 1.0;
		float UIMax = 255.0;
		float UIStep = 1.0;
	> = {25.0f};
}

Texture2D ColorTexture <
	string ResourceName = "default_color.dds";
	string UIName =  "Color Texture";
	string ResourceType = "2D";
>;

SamplerState ColorSampler
{
	Filter = MIN_MAG_MIP_LINEAR;
	AddressU = WRAP;
	AddressV = WRAP;
};

RasterizerState DisableCulling
{
	CullMode = NONE;
};

/************* Data Structures *************/

struct VS_INPUT
{
	float4 ObjectPosition : POSITION;
	float2 TextureCoordinate : TEXCOORD;
	float3 Normal : NORMAL;
};

struct VS_OUTPUT
{
	float4 Position : SV_Position;
	float3 Normal : NORMAL;
	float2 TextureCoordinate : TEXCOORD0;
	float3 WorldPosition : TEXCOORD1;
	float Attenuation : TEXCOORD2;
	float3 LightLookAt : TEXCOORD3;
};

/************* Vertex Shader *************/

VS_OUTPUT vertex_shader(VS_INPUT IN)
{
	VS_OUTPUT OUT = (VS_OUTPUT)0;

	OUT.Position = mul(IN.ObjectPosition, WorldViewProjection);
	OUT.WorldPosition = mul(IN.ObjectPosition, World).xyz;
	OUT.TextureCoordinate = get_corrected_texture_coordinate(IN.TextureCoordinate);
	OUT.Normal = normalize(mul(float4(IN.Normal, 0), World).xyz); 

	float3 lightDirection = LightPosition - OUT.WorldPosition;
	OUT.Attenuation = saturate(1.0f - length(lightDirection) / LightRadius);	

	OUT.LightLookAt = -LightLookAt;

	return OUT;
}

/************* Pixel Shader *************/

float4 pixel_shader(VS_OUTPUT IN) : SV_Target
{
	float4 OUT = (float4)0;

	float3 lightDirection = normalize(LightPosition - IN.WorldPosition);
	float3 viewDirection = normalize(CameraPosition - IN.WorldPosition);

	float3 normal = normalize(IN.Normal);
	float n_dot_l = dot(normal, lightDirection);
	float3 halfVector = normalize(lightDirection + viewDirection);
	float n_dot_h = dot(normal, halfVector);
	float3 lightLookAt = normalize(IN.LightLookAt);

	float4 color = ColorTexture.Sample(ColorSampler, IN.TextureCoordinate);
	float4 lightCoefficients = lit(n_dot_l, n_dot_h, SpecularPower);

	float3 ambient = get_vector_color_contribution(AmbientColor, color.rgb);
	float3 diffuse = get_vector_color_contribution(LightColor, lightCoefficients.y * color.rgb) * IN.Attenuation;
	float3 specular = get_scalar_color_contribution(SpecularColor, min(lightCoefficients.z, color.w)) * IN.Attenuation;

	float spotFactor = 0.0f;
	float lightAngle = dot(lightLookAt, lightDirection);
	if (lightAngle > 0.0f)
	{
		spotFactor = smoothstep(SpotLightOuterAngle, SpotLightInnerAngle, lightAngle);
	}

	OUT.rgb = ambient + (spotFactor * (diffuse + specular));
	OUT.a = 1.0f;

	return OUT;
}

/************* Techniques *************/

technique10 main10
{
	pass p0
	{
		SetVertexShader(CompileShader(vs_4_0, vertex_shader()));
		SetGeometryShader(NULL);
		SetPixelShader(CompileShader(ps_4_0, pixel_shader()));

		SetRasterizerState(DisableCulling);
	}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, float
, floating underflow
, out
, 1.0
, Spotlight
floating
,以便于您获取更多的相关知识。

时间: 2024-11-08 17:28:48

3D编程:Spotlights的相关文章

J2ME 3D编程——第一个3D程序

编程|程序 J2ME 3D编程--第一个3D程序(附源代码) 更多文章请访问:http://blog.csdn.net/mailbomb 参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1. 以下代码在J2ME WTK2.2下面编译通过. 2. 代码分为两个文件:First3DCanvas.java和First3D

J2ME 3D编程——第一个3D程序(附源代码)

参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1.以下代码在J2ME WTK2.2下面编译通过. 2.代码分为两个文件:First3DCanvas.java和First3DMIDlet.java. 3.使用J2ME WTK2.2建立新的工程,主MIDlet类为:first3d. First3DMIDlet 4.将

《OpenGL超级宝典(第5版)》——第1章,第1.4节3D编程的基本原则

1.4 3D编程的基本原则 现在,我们对实时3D的基本概念已经有了相当程度的认识.我们讨论了一些术语以及PC上的一些示例应用程序.那么,如何在自己的计算机上创建这样的图像呢?好吧,这正是本书剩余部分的任务所在.不过,读者还需要知道一些基础知识,这正是我们接下来将要讨论的. 1.4.1 并非工具包 OpenGL基本上是一种底层渲染API(应用程序接口).我们不能告诉它"在什么地方绘制什么"--我们需要自己动手,通过载入三角形,应用必要的变换和正确的纹理.着色器并在必要时应用混合模式来组合

手机上J2ME的3D编程-简单创建3D立方体(1)

编程|创建 参考文档:JSR-184 工具:Eclipse3.0+Eclipseme API:Mobile 3D Graphics API 模拟器:Sony Ericsson 分析: 在现实生活中,我们所看到的是一个3维系统.透过双眼,可以看到的是一个丰富多彩的世界.我们所用的照相机,能够拍出很多漂亮的图片.拍摄每张图片时,可以根据拍摄距离的远近可以调整所拍摄画面上的内容. 在虚拟的世界里,可以模拟真实世界.欲将虚拟世界展示出来,就要利用一个虚拟的照相机,将虚拟的世界拍摄出来. 在JSR-184

3D编程:Diffuse Lighting(漫反射光)

Diffuse Lighting(漫反射光) 不同的材质表面反射光的方式也不同.在镜面上光的反射角度与入身角度相等.当在一只猫的眼睛里看到一束怪异的光芒,这就是光的反射性:这是由于猫的眼睛反射光的方向与光源的照射方向平行,但是方向相反.漫反射表面对光的反射在各个方向上都一样. 近似计算一个漫反射光,最简单并且最常用的模型是Lambert's cosine law(朗伯余弦定律).根据Lambert's cosine law,照射到材质表面的光照亮度,与光源方向向量和面法线的夹角的余弦成正比.光源

3D编程:The Direct3D 11 Graphics Pipeline

Direct3D 11图形管线 个人电脑一般都有两个处理器:CPU和GPU,你需要对每一个处理器编写代码.这两个部件拥有完全不同的架构和指令集.在图形编程中,你需要对两个处理器都都编写软件,对于CPU应用程序使用通用的语言,比如C++,对于GPU则使用HLSL.DirectX是系统之间的桥梁.大部分关于图形编程的文章都集中讲述CPU部分或者GPU部分,但是这两部分都是非常难懂的.本书两个部分都会讲解.         在DirectX里面我们主要学习Direct3D.简单来说,Direct3D是

3D编程:第一章 Introducing DirectX

DirectX是一组API的集合,用于在微软平台上,包括Windows,Windows Phone,Xbox 360,以及Xbox One,开发游戏或图形相关的应用程序.DirectX从1990年代中期发展至今,并处于现在图形开发的前沿.Direct3D是DirectX里面一套3D图形API,是这本书主要讲述的.DirectX也包含了2D图形,输入,音频,文字渲染和GPU编程的系统支持.本章概述了DirectX和DirectX 11的图形管线. 回顾历史 DirectX 1.0版本发布于1995

3D编程:Real-Time 3D Rendering with DirectX and HLSL

介绍 图形编程是视频游戏,电影和科学模拟仿真背后的魔法.你在计算机屏幕上看到的每一个爆炸,颗粒以及眩光都是使用视频卡处理的.此外,你看到的每一个像素点都是通过GPU渲染和图形编程人员软件实现的,因为现代操作系统使用GPU绘制.这是一个广泛的话题,但一直以来只属于少数领域.甚至有经验的软件开发人员,通常认为渲染是一门高深的艺术,充满了复杂的数学工具和深奥的工具.另外,现代图形学的快速发展使得图形编程变成了不断前进的目标,同时建立一个起点变得更加困难. 这就是这本书的目的.通过这本书,你会学习对实时

3D编程:第十章 Project Setup and Window Initialization

第十章 Project Setup and Window Initialization 本章主要讲述建立一个渲染引擎所需要的基础知识.包括创建一个Visual Studio工程,实现游戏循环,并最终在显示器上显示一个窗口. A New Beginning 本章正式开始讲解C++编程(本书中使用C++集中讲解DirectX API的章节),重要的是,不要期望能迅速学会渲染一些场景到屏幕上.简单地说,要学会这些需要一段时间.首先需要花时间建立一些基础框架,在多个工程中重用代码的时候就会体现出这么做的