3D编程:Hello,Structs!

Hello,Structs!

在本节,使用C风格的结构体重新编写HelloShaders effect。使用数据结构比单个的参数能更好的组织多个shader输入和输出。首先在NVIDIA FX Composer中创建一个新effect和material,就像本章开始那样,使用Add Effect向导添加effect,或者简单的拷贝HelloShaders.fx到一个新文件HelloStructs.fx中。我偏向于第二个选择,因为经常需要重用shader代码,建立在以前的材质基础上。拷贝到HelloStructs.fx文件之后,在Assets panel的Materials部分点击鼠标右键,并选择Add Materials from File就可以把该shader文件添加到NVIDIA FX Composer中。找到并选中HelloStructs.fx文件,就会看到在Assets panel中已经有了新建的HelloStructs和HelloStructs_Material objects。

列表4.6 contains a full listing of the HelloStructs.fx effect.

列表4.6 HelloStructs.fx

cbuffer CBufferPerObject
{
	float4x4 WorldViewProjection : WORLDVIEWPROJECTION;
}
RasterizerState DisableCulling
{
	CullMode = NONE;
};
struct VS_INPUT
{
	float4 ObjectPosition: POSITION;
};
struct VS_OUTPUT
{
	float4 Position: SV_Position;
};
VS_OUTPUT vertex_shader(VS_INPUT IN)
{
	VS_OUTPUT OUT = (VS_OUTPUT)0;
	OUT.Position = mul(IN.ObjectPosition, WorldViewProjection);
	return OUT;
}
float4 pixel_shader(VS_OUTPUT IN) : SV_Target
{
	return float4(1, 0, 0, 1);
}
technique10 main10
{
	pass p0
	{
		SetVertexShader(CompileShader(vs_4_0, vertex_shader()));
		SetGeometryShader(NULL);
		SetPixelShader(CompileShader(ps_4_0, pixel_shader()));
		SetRasterizerState(DisableCulling);
	}
}

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

HelloShaders.fx和HelloStructs.fx之间的差别是微小的,但又是很重要的,因为他们建立了本书中使用的规范。首先要注意哪些是没有改变的,CBufferPerObject和DisableCulling objects都是一样的,main10 technique和对应的pass也是一样的。Pixel shader的内部代码也没有变化。主要是新加了两个结构体VS_INPUT和VS_OUTPUT,分别表示vertex shader的输入和输出。在HelloStructs.fx中的VS_INPUT也有一个与HelloShaders vertex shader中相同的输入变量ObjectPosition。唯一的区别是,在HelloStructs中该变量声明为float4类型而不是float3类型。也就不需要在向量中增加一个w分量。此外,vertex shadre现在返回一个VS_OUTPUT实例而不是一个float4类型的值,而且SV_Position语义不再直接与返回值关联,而是与VS_OUTPUT结构体中的Postion成员对应。该Postion成员取代了HelloShaders effect中的vertex shader的未命名的返回值。

下一步,分析最新的vertex shader的代码块。在该段代码中,声明并返回了一个VS_OUTPUT实例,就像C编程样式一样,可以通过dot opertator(点操作符)来访问VS_OUTPUT实例中的Position成员。同样,VS_INPUT结构体类型的参数IN中的ObjectPosition成员用于mul函数调用中。另外,使用了C风格的类型转换把OUT结构体变量中的成员都初始化为0。虽然初始化这一步不是强制的,但是却是一种好的编程习惯。最后,可以看到pixel shader中输入参数的类型正是vertex shader中的输出参数。在目前的例子中,还没有使用输入参数中的任何成员,但是在后面的shaders中将会用到。使用结构体重新组织的意义在于,现在可以增加shader输入和输出而不用修改vertex shaders和pixel shaders。HelloStructs的输出应用与HelloShaders的输出一致,与图4.3一样。

总结

本章编写了第一个HLSL shaders!学习了FX文件格式,constant buffer以及render states的部分知识。也进一步了解了HLSL语法,包括vector和matrix数据类型(比如float3,flaot4,float4×4)以及自定义的结构体。并在NVIDIA FX Composer中使用了这些知识生成了第一个渲染输出。本章完成的学习任务将是第二部分,“Shader Authoring with HLSL”后面章节的基础。

Exercises

1. Change the values of the RGB channels in the HelloShaders or HelloStructs pixel shader, and

observe the results.

2. Modify the DisableCulling rasterizer state object by setting CullMode = FRONT and then BACK, and

observe the results.

3. Now that you have a couple effects, get comfortable working within NVIDIA FX Composer. Create

Teapot, Torus, and Plane objects, and assign them either the HelloShaders or HelloStructs materials.

Notice how all objects that are assigned the same material are impacted when you change and recompile

the associated effect.

1.改HelloShaders或HelloStructs中pixel shader的RGB颜色通道值,并观察输出结果。

2.修改DisableCulling渲染状态,设置CullMode = FRONT,观察输出结果,再修改为CullMode = BACK观察输出结果。

3.现在你已经创建了两种effects,并学会了使用NVIDIA FX Composer。可以创建一些别的objects,比如Teapot,Torus以及Plane,并为这些objects指定HelloShaders或HelloStructs材质。注意观察在重新编译对应的effect之后,所有Objects都指定同一种材质的效果。

本意配套的学习代码:

http://download.csdn.net/detail/chenjinxian_3d/9570518

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索结构
, shader
, 输出
, shader fx
, 一个
, compose实例代码
vs10
,以便于您获取更多的相关知识。

时间: 2024-12-21 23:02:59

3D编程:Hello,Structs!的相关文章

J2ME 3D编程——第一个3D程序

编程|程序 J2ME 3D编程--第一个3D程序(附源代码) 更多文章请访问:http://blog.csdn.net/mailbomb 参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1. 以下代码在J2ME WTK2.2下面编译通过. 2. 代码分为两个文件:First3DCanvas.java和First3D

J2ME 3D编程——第一个3D程序(附源代码)

参考WTK2.2提供的demo,完成了第一个3D程序,虽然很简单,而且有些问题还不是很清楚,还是把代码共享出来和愿意学习J2ME 3D编程的朋友一起学习. 关于3D编程的资料,可以查阅我的blog. 关于代码的编译和运行说明如下: 1.以下代码在J2ME WTK2.2下面编译通过. 2.代码分为两个文件:First3DCanvas.java和First3DMIDlet.java. 3.使用J2ME WTK2.2建立新的工程,主MIDlet类为:first3d. First3DMIDlet 4.将

《OpenGL超级宝典(第5版)》——第1章,第1.4节3D编程的基本原则

1.4 3D编程的基本原则 现在,我们对实时3D的基本概念已经有了相当程度的认识.我们讨论了一些术语以及PC上的一些示例应用程序.那么,如何在自己的计算机上创建这样的图像呢?好吧,这正是本书剩余部分的任务所在.不过,读者还需要知道一些基础知识,这正是我们接下来将要讨论的. 1.4.1 并非工具包 OpenGL基本上是一种底层渲染API(应用程序接口).我们不能告诉它"在什么地方绘制什么"--我们需要自己动手,通过载入三角形,应用必要的变换和正确的纹理.着色器并在必要时应用混合模式来组合

手机上J2ME的3D编程-简单创建3D立方体(1)

编程|创建 参考文档:JSR-184 工具:Eclipse3.0+Eclipseme API:Mobile 3D Graphics API 模拟器:Sony Ericsson 分析: 在现实生活中,我们所看到的是一个3维系统.透过双眼,可以看到的是一个丰富多彩的世界.我们所用的照相机,能够拍出很多漂亮的图片.拍摄每张图片时,可以根据拍摄距离的远近可以调整所拍摄画面上的内容. 在虚拟的世界里,可以模拟真实世界.欲将虚拟世界展示出来,就要利用一个虚拟的照相机,将虚拟的世界拍摄出来. 在JSR-184

3D编程:The Direct3D 11 Graphics Pipeline

Direct3D 11图形管线 个人电脑一般都有两个处理器:CPU和GPU,你需要对每一个处理器编写代码.这两个部件拥有完全不同的架构和指令集.在图形编程中,你需要对两个处理器都都编写软件,对于CPU应用程序使用通用的语言,比如C++,对于GPU则使用HLSL.DirectX是系统之间的桥梁.大部分关于图形编程的文章都集中讲述CPU部分或者GPU部分,但是这两部分都是非常难懂的.本书两个部分都会讲解.         在DirectX里面我们主要学习Direct3D.简单来说,Direct3D是

3D编程:第一章 Introducing DirectX

DirectX是一组API的集合,用于在微软平台上,包括Windows,Windows Phone,Xbox 360,以及Xbox One,开发游戏或图形相关的应用程序.DirectX从1990年代中期发展至今,并处于现在图形开发的前沿.Direct3D是DirectX里面一套3D图形API,是这本书主要讲述的.DirectX也包含了2D图形,输入,音频,文字渲染和GPU编程的系统支持.本章概述了DirectX和DirectX 11的图形管线. 回顾历史 DirectX 1.0版本发布于1995

3D编程:Real-Time 3D Rendering with DirectX and HLSL

介绍 图形编程是视频游戏,电影和科学模拟仿真背后的魔法.你在计算机屏幕上看到的每一个爆炸,颗粒以及眩光都是使用视频卡处理的.此外,你看到的每一个像素点都是通过GPU渲染和图形编程人员软件实现的,因为现代操作系统使用GPU绘制.这是一个广泛的话题,但一直以来只属于少数领域.甚至有经验的软件开发人员,通常认为渲染是一门高深的艺术,充满了复杂的数学工具和深奥的工具.另外,现代图形学的快速发展使得图形编程变成了不断前进的目标,同时建立一个起点变得更加困难. 这就是这本书的目的.通过这本书,你会学习对实时

3D编程:第十章 Project Setup and Window Initialization

第十章 Project Setup and Window Initialization 本章主要讲述建立一个渲染引擎所需要的基础知识.包括创建一个Visual Studio工程,实现游戏循环,并最终在显示器上显示一个窗口. A New Beginning 本章正式开始讲解C++编程(本书中使用C++集中讲解DirectX API的章节),重要的是,不要期望能迅速学会渲染一些场景到屏幕上.简单地说,要学会这些需要一段时间.首先需要花时间建立一些基础框架,在多个工程中重用代码的时候就会体现出这么做的

3D编程:第九章 Normal Mapping and Displacement Mapping

第九章 Normal Mapping and Displacement Mapping 本章主要讲述两种图形学技术,支持在不增加objects的poly primitive的情况下,在场景中增加更多的细节.第一种是normal mapping,通过创建一些"fake" geometry(虚设的多边形图元)模拟光照作用.第二种是displacement mapping,根据纹理数据moving vertices actually(与"fake"相对应,这里指真实的移动