`
yellowcxx
  • 浏览: 2728 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

HLSL Shading for 3dsMax 03 - Specular Lighting

阅读更多
Purpose:
Create a Shader to Implement the Phong and Blinn-Phong Specular Lighting.

Solution:
1.Study of the Phong Specular Lighting from <<Introduction to 3D Game Programming with DirectX 10>>



2.the Blinn Modification to Phong



the major different between Phong and Blinn is the H(Half) vector, Phong calculate reflectance between R and V, the Blinn calculate with H and N(Normal).

3.Shader Source


float4x4 wvp : WorldViewProjection <string UIWidget="None" ;>;
float4x4 w : World <string UIWidget="None";>;
float4x4 vi: ViewInverse <string UIWidget="None";>;

float4 LightPosition : POSITION
<
	string UIName="Light Position";
	string Object="PointLight";
	string Space="World";
	int refID=0;
	
> =float4(100,100,100,0);

float4 LightColor: LIGHTCOLOR
<
	int LightRef=0;
> =float4(1,1,1,0);

float Glossiness
<
	string UIName="Glossiness";
	int UIMin=1;
	int UIMax=99;
	int UIStep=1;
> = 0;

float SpecularLevel
<
	string UIName="Specular Level";
	int UIMin=0;
	int UIMax=99;
	int UIStep=1;
> = 0;

bool EnableSpecular
<
	string UIName="Enable Specular Lighting";
> = true;

struct VS_INPUT
{
	float4 Pos: POSITION;
	float4 Normal: NORMAL;
};

struct VS_OUTPUT
{
	float4 Pos : POSITION0;
	float3 L: TEXCOORD0;
	float3 N: TEXCOORD1;
	float3 V: TEXCOORD2;
};

VS_OUTPUT vs_main(VS_INPUT Input)
{
	VS_OUTPUT Result;
	Result.Pos = mul(Input.Pos,wvp);
	
	float3 worldPos=mul(Input.Pos,w);
	Result.L=LightPosition-worldPos;
	Result.N=mul(Input.Normal,w);
	Result.V=vi[3]-worldPos;
	
	return Result;
}

float4 ps_main(VS_OUTPUT Input):COLOR
{
	float3 N=normalize(Input.N);
	float3 L=normalize(Input.L);
	float3 V=normalize(Input.V);
	float3 H=normalize(L+V);
	
	float NdotL=max(0.0f,dot(N,L));
	float NdotH=max(0.0f,dot(H,N));
	
	float3 Diffuse=LightColor*NdotL;
	float3 Specular=EnableSpecular?Glossiness*pow(NdotH,SpecularLevel):0;
	
	return float4(Diffuse+Specular,1);
}

float4 ps_phong_main(VS_OUTPUT Input):COLOR
{
	float3 N=normalize(Input.N);
	float3 L=normalize(Input.L);
	float3 V=normalize(Input.V);
	float3 R=-reflect(L,N);
	
	float NdotL=max(0,dot(N,L));
	float RdotV=max(0,dot(R,V));
	
	float3 Diffuse=LightColor*NdotL;
	float3 Specular=EnableSpecular?Glossiness*pow(RdotV,SpecularLevel):0;
	return float4(Diffuse+Specular,1);
}

technique BlinnSpecular
{
	pass Blinn
	{
		VertexShader = compile vs_2_0 vs_main();
		PixelShader  = compile ps_2_0 ps_main();
	}
};

technique PhongSpecular
{
	pass Phong
	{
		VertexShader = compile vs_2_0 vs_main();
		PixelShader  = compile ps_2_0 ps_phong_main();
	}
};


4.Preview
Specular lighting disabled


Phong and Blinn compares
Phong


Blinn


Phong


Blinn


Phong


Blinn

  • 大小: 167.1 KB
  • 大小: 21.8 KB
  • 大小: 91 KB
  • 大小: 183.5 KB
  • 大小: 197.8 KB
  • 大小: 165.2 KB
  • 大小: 176 KB
  • 大小: 192.4 KB
  • 大小: 162.1 KB
分享到:
评论

相关推荐

    HLSL-and-Pixel-Shaders-for-XAML-Developers_HLSL_

    标题 "HLSL-and-Pixel-Shaders-for-XAML-Developers_HLSL_" 指向的主题是关于在XAML开发中使用HLSL(High-Level Shader Language)和像素着色器的技术。HLSL是一种专门用于图形处理单元(GPU)编程的语言,尤其在...

    Real-Time_3D_Rendering_with_DirectX_and_HLSL

    《Real-Time_3D_Rendering_with_DirectX_and_HLSL》是一本专注于实时三维渲染技术的专著,尤其强调了DirectX和High-Level Shading Language(HLSL)的应用。这本书是为那些想要深入理解现代游戏开发、虚拟现实、可视...

    HLSL.rar_HLSL_HLSL Chinese_HLSL P_shading_着色

    本教程针对HLSL(High Level Shading Language)初学者,从应用的角度对HLSL、顶点着色器、像素着色器和Effect效果框架进行了介绍,教程中去掉了对HLSL语法等一些细节内容的讨论,力求帮助读者尽可能快地理解HLSL...

    【0积分】HLSL Tool For Visual Studio

    【0积分下载】版本:1.1.302 原作者最近更新于2020/12/15

    HLSL初级教程-着色器

    HLSL(High Level Shading Language)是一种高级的着色语言,主要用于DirectX平台。与早期Direct8.x中使用的低级着色汇编语言相比,HLSL具有更高的可读性和可维护性,它的语法类似于C语言,使得开发者更容易理解和...

    HLSL Development Cookbook.pdf

    - **HLSL(High-Level Shading Language)**:一种由微软开发的高级着色语言,主要用于编写运行在DirectX环境下的着色器程序。HLSL的设计目的是为图形程序员提供一个更接近传统编程语言的接口来处理GPU(图形处理器...

    HLSL基础教程 DirectX

    HLSL(High-Level Shading Language)是一种高级着色语言,它被设计用于DirectX API中的着色器编程。这种语言允许开发者以更直观的方式编写顶点着色器(Vertex Shader)和像素着色器(Pixel Shader),从而实现对3D图形...

    HLSL 入門教學

    HLSL (High-Level Shading Language) 是一种高级着色语言,由微软开发,主要应用于DirectX图形API中。HLSL提供了一种类似C语言的语法,使得开发者能够更容易地编写和调试着色器代码。 ##### 1.3 如何写HLSL着色器?...

    HLSL特效 详细讲解shade

    HLSL的语法基于C/C++,包括控制流语句(if、for、while)、函数定义、结构体声明等。 8: 数学表达式和关键字 HLSL支持标准的数学运算符,如加减乘除、指数、取模等。同时,有关键字如return、break、continue等,...

    HLSL Pixel Shader-Chinese

    在计算机图形学领域,HLSL(High-Level Shader Language)是一种强大的着色语言,由微软为DirectX设计,用于编写图形处理单元(GPU)上的着色器程序。在这个主题中,我们将深入探讨“HLSL Pixel Shader”以及如何...

    Direct3D/HLSL简单的介绍

    3. **广泛的应用**:除了游戏开发之外,HLSL还被广泛应用于科学计算、计算机视觉等领域,特别是在GPGPU(通用计算图形处理器)技术的发展下,HLSL的应用范围得到了进一步扩展。 #### 三、Direct3D的演变历程 - **...

    HLSL程序入门03

    通过"03_HLSL程序入门"这一部分,你将逐步构建起对HLSL的扎实基础,学会如何利用HLSL来提升3D图形的质量和表现力。在实际的项目开发中,你可以将这些知识应用到游戏开发、虚拟现实、可视化等领域,创造出更加...

    HLSL实现每像素光照和每顶点光照

    本主题将深入探讨如何使用High-Level Shading Language (HLSL) 在DirectX环境中实现每像素光照(Per-Pixel Lighting)和每顶点光照(Per-Vertex Lighting)。 HLSL是一种专门用于DirectX图形API的着色语言,它允许...

    03_HLSL程序入门

    Direct3D HLSL(High-Level Shader Language)是微软开发的一种着色语言,它允许程序员为图形硬件编写高效的渲染代码,从而实现复杂的图形效果。在3D游戏开发、计算机图形学和视觉艺术等领域,HLSL被广泛应用于创建...

    HLSL基础教程中文版

    HLSL(High-Level Shading Language 高级着色语言)是一种高级着色语言,用于编写着色器(Shader)。它是DirectX Effect Framework的一部分,帮助开发者集成和管理shader到应用程序中。 一、HLSL基础知识 HLSL是一...

    HLSL语法基础中文书-新手

    自己备份用

    hlsl2glsl hlsl转换为glsl图形化工具

    3. **特性与函数映射**:hlsl2glsl处理 HLSL 特性(如`cbuffer`)和函数(如`tex2D`),将其转换为GLSL相应的特性(如`uniform`)和函数(如`texture2D`)。 4. **布局和语义处理**:GLSL和HLSL对顶点和片段着色器...

Global site tag (gtag.js) - Google Analytics