着色器和效果——2.4 样例应用程序:散射光照(上)

原创 2004年05月13日 12:33:00

2.4 样例应用程序:散射光照(上)

阅读此文表明您已同意文末的声明<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作为创建并使用顶点着色器的热身,我们写一个顶点着色器,它用一个方向(平行)光对每个顶点进行标准的散射光照。简而言之,散射光照根据顶点法线和光线向量(它指向光源方向)的角度计算顶点接收到的光线的数量。角度越小,则顶点接收到的光线就越多;而角度越大,则顶点接收到的光线就越少。如果角度大于等于90度,顶点就接收不到光线了。

我们以检阅着色器代码作为开始:

// File: diffuse.txt

// Desc: Vertex shader that does diffuse lighting.

 

//

// Global variables we use to hold the view matrix, projection matrix,

// ambient material, diffuse material, and the light vector that

// describes the direction to the light source. These variables are

// initialized from the application.

//

matrix ViewMatrix;

matrix ViewProjMatrix;

 

vector AmbientMtrl;

vector DiffuseMtrl;

 

vector LightDirection;

 

//

// Global variables used to hold the ambient light intensity (ambient

// light the light source emits) and the diffuse light

// intensity (diffuse light the light source emits). These

// variables are initialized here in the shader.

//

 

vector DiffuseLightIntensity = {0.0f, 0.0f, 1.0f, 1.0f};

vector AmbientLightIntensity = {0.0f, 0.0f, 0.2f, 1.0f};

 

//

// Input and Output structures.

//

 

struct VS_INPUT

{

     vector position : POSITION;

     vector normal   : NORMAL;

};

 

struct VS_OUTPUT

{

     vector position : POSITION;

     vector diffuse  : COLOR;

};

 

//

// Main

//

 

VS_OUTPUT Main(VS_INPUT input)

{

     // zero out all members of the output instance.

     VS_OUTPUT output = (VS_OUTPUT)0;

 

     //

     // Transform position to homogeneous clip space

     // and store in the output.position member.

     //

     output.position = mul(input.position, ViewProjMatrix);

 

     //

     // Transform lights and normals to view space. Set w

     // components to zero since we're transforming vectors

     // here and not points.

     //

     LightDirection.w = 0.0f;

     input.normal.w   = 0.0f;

     LightDirection   = mul(LightDirection, ViewMatrix);

     input.normal     = mul(input.normal, ViewMatrix);

 

     //

     // Compute cosine of the angle between light and normal.

     //

     float s = dot(LightDirection, input.normal);

 

     //

     // Recall that if the angle between the surface and light

     // is greater than 90 degrees the surface receives no light.

     // Thus, if the angle is greater than 90 degrees we set

     // s to zero so that the surface will not be lit.

     //

     if( s < 0.0f )

         s = 0.0f;

 

     //

     // Ambient light reflected is computed by performing a

     // component-wise multiplication with the ambient material

     // vector and the ambient light intensity vector.

     //

     // Diffuse light reflected is computed by performing a

     // component-wise multiplication with the diffuse material

     // vector and the diffuse light intensity vector. Further

     // we scale each component by the shading scalar s, which

     // shades the color based on how much light the vertex received

     // from the light source.

     //

     // The sum of both the ambient and diffuse components give

     // us our final vertex color.

     //

 

     output.diffuse = (AmbientMtrl * AmbientLightIntensity) +

                      (s * (DiffuseLightIntensity * DiffuseMtrl));

     return output;

}

[声明]:本文译自Frank Luna的《Introduction to 3D Game Programming with DirectX 9.0》,限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;本文仅用于学习交流与参考用途,不得用于任何形式的商业用途;如需转载需事先征得作者本人和译者的同意,保持文章的完整性,并注明作者、译者和出处,作者保留对译文的所有权利。对于违反以上条款造成的后果,译者对此不负任何责任。我的MSNRaymond_King123@hotmail.com,欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友与我进行交流。

 

着色器和效果——2.4 样例应用程序:散射光照(下)

2.4 样例应用程序:散射光照(下)阅读此文表明您已同意文末的声明既然我们已经看到了实际的顶点着色器的代码,那么就让我们改变方式来看看应用程序的代码。这个应用程序有下列相关的全局变量:IDirect3...
  • RaymondKing
  • RaymondKing
  • 2004年05月17日 17:13
  • 3198

大气散射光照模型

大气散射光照模型  (5296)  (5) 上面这个图使用大气散射光照模型来计算天空颜色和在晨阳照耀下的薄雾的颜色,不同于传统的天空球和雾的算法,这里很好的...
  • liqiang981
  • liqiang981
  • 2016年08月25日 10:55
  • 1827

探究OpenGL光照模型的着色器实现

OpenGL的着色器是新的显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013年09月27日 23:08
  • 3426

OpenGL ES着色语言-光照效果之散射光

OpenGL光照模型,在固定管线中,主要是调用OpenGL函数实现,如果使用着色器,该怎么实现。本文的例子是移植OpenGL 4.0 Shading Language Cookbook中第二章的例子。...
  • zhouxuguang236
  • zhouxuguang236
  • 2016年11月20日 21:08
  • 2205

OpenGL光照模型--四种光照效果

OpenGL光照模型           为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光...
  • langzi007008
  • langzi007008
  • 2016年04月16日 20:37
  • 2639

glsl着色器 光照和纹理计算 (有用!)

http://my.oschina.net/sweetdark/blog/214220 以下内容只针对GLSL1.20的版本进行说明的,有些内置的变量在1.20之后,已经被废弃了。 ...
  • z444_579
  • z444_579
  • 2016年07月20日 12:01
  • 1937

Shader山下(十四)顶点片段着色器处理光照

Shader山下(二)光照模型——漫反射里介绍了如何为表面着色器添加光照模型,但是在顶点片段(vertex-fragment)着色器里如何处理光照呢? 本文就实现一个与内置Lambert光照模型相同...
  • ecidevilin
  • ecidevilin
  • 2016年10月14日 09:06
  • 1666

着色器和效果——2.5 样例应用程序:卡通渲染(上)

2.5 样例应用程序:卡通渲染(上)阅读此文表明您已同意文末的声明作为第二个顶点着色器的例子,让我们编写两个顶点着色器,它们以卡通风格绘画的方式对网格着色(shade)和画轮廓(outline)。图1...
  • RaymondKing
  • RaymondKing
  • 2004年05月17日 17:12
  • 4360

适合手机上用的实时光照shader,移动平台上着色器的优化

移动平台上着色器的优化 最近在看本书叫《unity着色器和屏幕特效开发秘籍》挺不错的。喜欢的朋友可以下载http://pan.baidu.com/s/1bXwMEM 直接上源码吧,有注释看着舒...
  • u013354943
  • u013354943
  • 2016年12月08日 15:19
  • 1310

OpenGL中的光照与材料

OpenGL中的光照与材料      在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射,这3种不同类型的光分别是:环境光(ambient)、散射光(diffu...
  • Haohan_Meng
  • Haohan_Meng
  • 2014年11月23日 10:29
  • 2250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:着色器和效果——2.4 样例应用程序:散射光照(上)
举报原因:
原因补充:

(最多只允许输入30个字)