XNAShaders编程教程1-环境光照.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
XNAShaders编程教程1-环境光照.doc

PAGE5 / NUMPAGES11 XNA Shaders编程教程1-环境光照 原文地址: /2011/12/12/xna-4-0-shader-programming-1intro-to-hlsl-ambient-light/(需翻墙)。 您好,欢迎来到XNA Shader教程1。我的名字叫Petri Wilhelmsen,是Dark Codex Studios的成员。我们经常会参加各种图形/游戏开发的竞赛,如Gathering,Assembly,Solskogen,Dream-Build-Play和NGA等。 本XNA Shaders编程教程将讨论XNA的不同方面的知识以及如何使用XNA和GPU编写HLSL。我将从一些基本理论开始,然后深入到shader编程的实际方法。 理论部分不会面面俱到,但足以让你开始使用shader并自己实践。它将涵盖HLSL的基础,HLSL语言如何工作和一些必须知道的关键字。 今天,我将介绍XNA和HLSL以及一个简单的环境光照算法。 先决条件 XNA的编程基础,因为我们将涉及到加载纹理,三维模型,矩阵和一些数学知识。 Shader简史 在DirectX8之前,GPU使用固定方式变换像素和顶点,即所谓的“固定管道”。这使得开发者不可能改变像素和顶点转化和处理的进程,使大多数游戏的图像表现看起来非常相似。 2001年,DirectX8提出了顶点和像素着色器,这让开发者可以在管道中决定如何处理顶点和像素,使他们获得了很强的灵活性。 一开始shader编程使用汇编语言程序使用的着色器,这对shader开发者来说相当困难,Shader Model 1.0是唯一支持的版本。但DirectX9发布后这一切改变了,开发者能够使用高级着色语言(HLSL)取代了汇编语言,HLSL语法类似C语言,这使shader更容易编写、阅读和学习。 DirectX 10.0提出了一个新的shader——Geometry Shader作为Shader Model 4.0的组成部分。但这需要一个最先进的显卡和Windows Vista才能支持。 DirectX的最新版本为DirectX 11,它包含了tesselator,用于并行编程的DirectCompute等新功能。 XNA支持Shader Model 1.0至3.0,可以在XP,Vista和XBox360!上运行。 Shader? 那么什么是shader?shader一组运行在GPU上的指令,使开发者能够创建小型的程序控制图形管线的三个阶段:像素着色器阶段,几何着色器阶段和像素着色器阶段。 图1:可编程图形管道 如图1所示,你可以对绿色部分进行编程,而其他阶段是固定的,你无法控制它们。Xbox360和XNA不支持几何着色器,所以本教程不会涉及它。下面我们快速浏览一下顶点着色器和像素着色器(不理解代码也别急,我们会在后面的部分加以讨论) Vertex shader Vertex shaders用来逐顶点地处理顶点数据。例如可以通过将模型中的每个顶点沿着法线方向移动到一个新位置使一个模型变“胖”(这称之为deform shaders)。 Vertex shaders从应用程序代码中定义的一个顶点结构获取数据,并从顶点缓冲区加载这个结构传递到shader。这个结构描述了每个顶点的属性:位置,颜色,法线,切线等。 接着Vertex shader将输出传递到pixel shader。可以通过在shader中定义一个结构包含你想要存储的数据,并让Vertex shader返回这个实例来决定传递什么数据,或通过在shader中定义参数,使用out关键字来实现。输出可以是位置,雾化,颜色,纹理坐标,切线,光线位置等。 将一个对象的坐标转换到屏幕空间的简单顶点着色器代码如下: struct VertexShaderInput { float4 Position : POSITION0; }; struct VertexShaderOutput { float4 Position : POSITION0; }; VertexShaderOutput VertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; float4 worldPosition = mul(input.Position, World); float4 viewPosition = mul(worldPosition, View); output.Position = mul(viewPosition, Projection); return output; } Pixel Shade

文档评论(0)

zcbsj + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档