Directx教程(25) 简单的光照模型(4)
在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色。
前面的三个工程,我们都用的是方向光源(directional light),它的特点是没有光源位置或者说光源位置位于无穷远处,且光线在各个方向都是平行的,所以在工程myTutorialD3D11_17中,我们看到的程序界面上,cube每个面上的颜色都是一样的[因为diffuse光占颜色的大部分]。
方向光原理可用以下图表示:
现在我们尝试点光源,点光源原理如下:
因为计算漫反射时候,每个顶点的漫反射颜色都和到光源位置向量有关,所以我们可以修改light.vs如下:
//自发射颜色
float4 emissive = Ke;
//计算环境光
float4 ambient = Ka * globalAmbient;
//计算漫反射光
//用LightDirection就是纯平行光
//光源位置减顶点位置,是不考虑衰减的点光源
float3 L = normalize(lightPosition.xyz - P);
float diffuseLight = max(dot(N, L), 0);
float4 diffuse = Kd * lightColor * diffuseLight;
//计算高光
float3 V = normalize(cameraPosition.xyz - P);
float3 H = normalize(L + V);
float specularLight = pow(max(dot(N, H), 0), shininess);
if ( diffuseLight <= 0)
specularLight = 0;
float4 specular = Ks * lightColor * specularLight;
output.color = emissive + ambient + diffuse + specular;
注意L的计算,我们这儿取归一化的光源顶点->光源向量。
程序的最终效果如下,看以看出比前一个工程中的方向光的效果要好一些:
完整的代码请参考:
工程文件myTutorialD3D11_18
代码下载:
http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip
Directx教程(25) 简单的光照模型(4)的更多相关文章
- Directx教程(29) 简单的光照模型(8)
原文:Directx教程(29) 简单的光照模型(8) 现在我们新建一个工程myTutorialD3D_23,在这个工程中,对前面一章的代码进行一些整理: 1.我们在顶点属性中增加材质的的漫 ...
- Directx教程(28) 简单的光照模型(7)
原文:Directx教程(28) 简单的光照模型(7) 现实生活中的点光源都是随着距离衰减的,比如一个电灯泡在近处会照的很亮,远处光线就很弱.本节中我们在前面光公式的基础上,再给漫反射和 ...
- Directx教程(27) 简单的光照模型(6)
原文:Directx教程(27) 简单的光照模型(6) 从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightCla ...
- Directx教程(26) 简单的光照模型(5)
原文:Directx教程(26) 简单的光照模型(5) 在前面的工程中,我们都是在vs中实现顶点光照计算,然后再把顶点颜色传到ps中.本章中我们尝试fragment光照(或者说叫ps光照),在 ...
- Directx教程(24) 简单的光照模型(3)
原文:Directx教程(24) 简单的光照模型(3) 在工程myTutorialD3D11_17中,我们重新定义我们的cube顶点法向,每个三角形面的顶点法向都是和这个三角形的面法向是一致 ...
- Directx教程(23) 简单的光照模型(2)
原文:Directx教程(23) 简单的光照模型(2) 在工程myTutorialD3D11_16中,我在文件light.vs中定义了一个材质光源属性常量缓冲. //const buffer最好 ...
- Directx教程(22) 简单的光照模型(1)
原文:Directx教程(22) 简单的光照模型(1) 在前面的教程中,我们在顶点属性中直接给顶点赋颜色,这样生成的三维物体缺乏真实感,如下图中两个立方体,左边的是通过光照生成物体表面颜色的 ...
- 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...
- [译]Vulkan教程(25)描述符布局和buffer
[译]Vulkan教程(25)描述符布局和buffer Descriptor layout and buffer 描述符布局和buffer Introduction 入门 We're now able ...
随机推荐
- 基于Skyline与ArcGIS Server的二三维联动功能实现
基于Skyline与ArcGIS Server的二三维联动功能实现主要利用WEB技术.ArcGIS for JavaScript.Skyline 二次开发以及ArcGIS 10.1 桌面工具. 利用A ...
- 简单易学的机器学习算法—SVD奇异值分解
简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义 假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...
- vue 路由重定向
- Cesium 1.51新功能评测
前言 之前介绍Cesium1.50版本的新功能时,很多人把1.50写成1.5.这两个版本可不一样,之间差了45个小版本号,1.5版本大概是Cesium三年前的版本了. Cesium每月月初的第一个工作 ...
- Python - 基本数据类型及其常用的方法之列表
列表: 特点:用 [] 括起来,切元素用逗号分隔:列表内的元素可以为任何的数据类型. 列表的基本操作: 1.修改 li = [12, 5, 6, ["Aiden", [2, 4], ...
- Docker(一)简介及核心概念
1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这 ...
- 跟我一起了解koa(四)
我们使用第二讲中的路由页面,再结合ejs,一起了解ejs在koa中的应用 1.安装koa-views和ejs cnpm install --save koa cnpm install koa-rout ...
- 再也不怕数据丢失!阿里云RDS MySQL 8.0上线回收站功能
背景 MySQL 在生产环境使用过程中,会伴随着开发和运维人员的误操作,比如 DROP TABLE / DATABASE,这类 DDL 语句不具有可操作的回滚特性,而导致数据丢失,AliSQL 8.0 ...
- Django项目:CRM(客户关系管理系统)--55--46PerfectCRM实现登陆后页面才能访问
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- HTTP协议①介绍
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于TCP/IP通信 ...