openGL CG 系列教程3-Pixel Lighting

原创 2010年04月30日 18:36:00

*原创文章,转载请注明出处*

 

openGL CG 系列教程3-Pixel Lighting

 

在上一篇教程中介绍了phong model下的一般光照,并且用Cg着色语言实现了固定渲染管线中gouraud shading光照效果。由于是基于vertex的光照,虽然采用gouraud shading要比flat shading效果好的多,但是和phong shading的效果相差很大。这里大家要注意的是,phong modelphong shading的区别。上一篇教程所讲的光照模型叫phong model,而这篇教程要介绍的一种着色方法叫phong shading,必须要使用shader才能实现。下面的图中对比了采用flat shadinggouraud shadingphong shading技术渲染的一个圆环。

 

 

 

Flat shading

Gouraud shading

Phong shading

 

 

 

有了上一篇教程的基础,用Cg来实现基于pixel lighingphong shading光照就容易多了。绝大部分的Cg shader代码都是一样的,主要的改变就是这次不是在vertex shader里光照,而是在fragment shader里计算光照。所以整个vertex shader的代码很简单,将要渲染的物体的顶点位置,顶点法线传入fragment shader就是vertex shader的全部工作。整个vertex shader的代码如下。

 

03vs.cg

struct output

{

      float4 position  : POSITION;    

      float3 objectPos : TEXCOORD0;   

      float3 normal     : TEXCOORD1;

};

 

output vs_main( float4 position : POSITION,

                  float3 normal   : NORMAL,

                  uniform float4x4 MV,

                  uniform float4x4 MVP

                    )

{

      output OUT;

      OUT.position = mul(MVP, position);

      OUT.objectPos = mul(MV, position).xyz;

      OUT.normal = mul(MV, float4(normal,0.0)).xyz;

 

      return OUT;

}

 

上面的代码的输出结构体中有三个成员。Position是传入的物体的顶点,该顶点将用ModelViewProjection矩阵转换成剪裁坐标系中的坐标供光栅化使用。一旦将坐标转换后,我们就无法在fragment shader中使用物体的顶点坐标了。由于要在fragment shader中计算光照,所以我们要将物体的顶点位置,顶点法线都传入到fragment shader中。这里物体转换前的顶点和法线分别使用了语义TEXCOORD0TEXCOORD1,代表将它们作为纹理坐标后传入fragment shader。这样GPU会把顶点和法线信息当做纹理坐标来处理,在贴图的时候,GPU会根据纹理自动插值计算每个像素对应的颜色,而现在GPU插值计算出来的就是每个像素对应的坐标和法线信息了。有了这些数据就可以进行phong shading的计算了。光照计算的公式和方法和上一个教程介绍的一模一样。下面是fragment shader的代码。

 

03fs.cg

uniform float3 LightPosition;

uniform float3 eyePosition;

uniform float3 I;

uniform float3 Ka;

uniform float3 Kd;

uniform float3 Ks;

uniform float shininess;

 

struct input{

      float3 objectPos: TEXCOORD0;   

      float3 normal   : TEXCOORD1;

};

 

struct output{

      float4 color     : COLOR;

};

 

output fs_main( in input IN )

{

      output OUT;

 

      float3 N = normalize(IN.normal);

      float3 P = IN.objectPos;

 

      float3 L = normalize(LightPosition - P);

      float NdotL = max(dot(N,L),0);

 

      float3 ambient = Ka * I;

      float3 diffuse = Kd * I * NdotL;

 

      float3 V = normalize(eyePosition - P);

      float3 H = normalize(L+V);

      float NdotH = pow(max(dot(N,H), 0), shininess);

 

      if(NdotL<=0)

           NdotH = 0.0;

      float3 specular = Ks*I*NdotH;

 

      float3 color = ambient + diffuse + specular;

      OUT.color.xyz= color;

      OUT.color.w = 1.0;

 

      return OUT;

}

 

 

*原创文章,转载请注明出处*

 

 

【学习OpenGL小记之一】 OpenGL开发环境配置

一、开发环境 1、操作系统:Windows 7(64位) 2、编程环境:Microsoft Visual Studio 2010 二、环境配置 1、下载OpenGL库,这里可以自己从其他网...
  • qingyang8513
  • qingyang8513
  • 2015年05月07日 19:26
  • 926

OpenGL ES 学习教程(七) 亮瞎狗眼的 Specular Lighting 镜面高光

上一篇了解到的 Diffuse Lighting 漫反射光照 对比,Speculer Lighting 镜面高光需要添加一个新的变量 - 观察者的位置。 我们代码中观察者 就是 摄像机,所以就使用 摄...
  • cp790621656
  • cp790621656
  • 2015年12月13日 03:08
  • 2001

Cg编程入门(OpenGL)

原注:B Alex D'Angelo (alexz@FusionIndustries.com) 译:  华文广   未经本人同意,不能用于商业出版用途。       本文将介绍如何在...
  • sangni007
  • sangni007
  • 2013年08月02日 10:54
  • 1694

OpenGL: CG编程入门

原注:B Alex D'Angelo (alexz@FusionIndustries.com)译:  华文广   未经本人同意,不能用于商业出版用途。     本文将介绍如何在你现有的图形程序中加入对...
  • Augusdi
  • Augusdi
  • 2014年02月27日 11:05
  • 1307

数字图像处理、CG与CV

2015-06-17    这段时间工作没有那么忙了,说是没那么忙,我每天还是10点左右才回去的。开始回顾CV方面的知识,按照OpenCV书籍上的例子在学习。发现,经过一段时间的间隔,再次...
  • cloudqiu
  • cloudqiu
  • 2017年02月10日 13:48
  • 566

【OpenGL】Shader实例分析(六)- 卡牌特效

本文将介绍怎么通过alpha通道来隐藏信息,并实现卡牌特效;本文的核心是,利用图片的alpha通道来隐藏信息,达到节省资源的效果...
  • stalendp
  • stalendp
  • 2014年06月15日 15:44
  • 12440

Cg教程_可编程实时图形权威指南(扫描清晰版)+部分unity shader 知识

Cg教程_可编程实时图形权威指南(扫描清晰版) .pdf (34.5 MB, 下载次数: 239)  Shader Model(在3D图形领域常被简称SM)就是“优化渲染引擎模式”。事实上,...
  • u013100250
  • u013100250
  • 2015年03月07日 00:23
  • 2152

Diffuse Lighting(漫反射光)

Diffuse Lighting(漫反射光) 不同的材质表面反射光的方式也不同。在镜面上光的反射角度与入身角度相等。当在一只猫的眼睛里看到一束怪异的光芒,这就是光的反射性:这是由于猫的眼睛反射光的方...
  • chenjinxian_3D
  • chenjinxian_3D
  • 2016年07月07日 18:27
  • 946

Unity&Shader基础篇-Cg语法

1.2、Cg语法基础   如C++、C#和Java等高级语言一样,Cg语言也有自己的数据类型和关键字。掌握和理解这些关键字是写好Cg程序的基础。 1.2.1、Cg的数据类型与关键字 基本数据类型:Cg...
  • zhangxiao13627093203
  • zhangxiao13627093203
  • 2016年10月18日 17:07
  • 2604

Unity Shader 学习笔记 (三) CG 标准函数库

Unity Shader 学习笔记 (三) CG 标准函数库 1. 数学函数(Mathematical Functions) 2. 几何函数(Geometric Functions) 3. 纹理映...
  • u011416077
  • u011416077
  • 2015年08月16日 00:53
  • 1304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openGL CG 系列教程3-Pixel Lighting
举报原因:
原因补充:

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