当前位置: 首页 > 编程日记 > 正文

编写和调试Shader程序(1)

编写和调试Shader程序
(1)DirectX EffectEdit


JohnsonFeng

常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手,本文先介绍DirectX的EffectEdit。

EffectEdit是DirectX9.0在August2005之前提供的一个编辑器
Binary:$installdir/bin/dxutils/effectedit.bin
Soucecode: $installdir/samples/c++/direct3d/effectedit
以下是EffectEdit的界面,虽然看上去很简陋,但是挺好用,笔者在这个工具上写过法线贴图程序,动态水波程序:

directx03182003_fig2.gif

EffectEdit在August2005版本之后就去掉了,取而代之的是DirectX Viewer(DxViewer.exe),被这个工具替换掉的还有mview.exe,也是一个很好用的工具。在该版本中也可以找到EffectEdit的源代码。
此工具支持一些基本用于编辑的语义(semantic)和释义(anotation)工具,这里列出它支持的释义。对应版本的帮助中提供了释义介绍,但是不完整,根据源码,笔者将列出:

(一)工具内置语义(Semantic)
语义还包括输入输出语义,这里仅仅列出编辑器实用的,用于自动初始化的语义,不区分大小写,其中斜体是文档中没有列出但有效的语义。

Semantic Meaning
WORLD
world transform matrix   VIEW view transform matrix PROJECTION projection transform matrix WORLDVIEW world*view VIEWPROJECTION view*projection WORLDVIEWPROJECTION world*view*projection MATERIALAMBIENT material.ambient MATERIALDIFFUSE material.diffuse MATERIALSPECULAR material.specular MATERIALPOWER material.power TIME current time MESHRADIUS mesh bounding sphere radius
举例:
sample.fx中的以下代码中,k_a将会自动用材质的颜色初始化,此编辑器中,材质是编辑器自动从.x中读取的。
float4 k_a :MATERIALAMBIENT={1.0f,1.0f,1.0f,1.0f};
另外一个很有用的语义是TIME,将被自动初始化成当前时间,类型为float,在调试动画时比较有用。


(二)释义(Anotation)
释义和注释是不同的概念,释义即写在变量后边的括号中的变量,特定类型和名字的释义变量取可以被正确地初始化为被解释对象的属性,
EffectEdit中纹理对象支持的释义包括:

Texture AnotationMeaning
NAMEtexture filename
FUNCTIONtexture blendfunction?
TARGETCompile Target(tx_0,tx_1),refer D3DXCompileShader
WIDTHspecify texture width
HEIGHTspecify texture height
DEPTHvolumn depth
TYPEtexture type

其中纹理类型:
Texture TypeMeaning
volumn该纹理是一个体积纹理
cube该纹理是一个cubetexture
<default>一般的2D纹理

(三)内置变量
Texture TypeMeaning
BIMG调试视窗的背景
XFILE调试程序使用的.x文件
BCLR调试程序背景色

另外,下边给出一些学习Shader程序的路径供参考:

stepcontentdescription
1technique一个物体可以有多种渲染方法,每个technique代表一种
2pass某些特效在实现时需要渲染多次物体,渲染一次就对应一个pass,每个pass可以选用各自的顶点和像素Shader
3renderstate渲染状态可以在pass内指定,语法参考dx帮助文档
4input/output Semantic输入和输出语义告诉设备,Shader程序的入口参数用顶点的什么信息初始化,以函数返回值代表什么含义。
5datatype常见的如floatfloat3float4代表13432位浮点数字
float4x4可以定义矩阵,float2可以定义uv坐标,float3可以用来定义法线。Shader程序可以认为是一种浮点数计算的程序。
6functionHLSL提供了很多内置的数学函数,参考dx相关文档
7algorithm这是学习Shader最难的部分了,对于VS,最好是学习好了固定管线的原理之后再写Shader程序。对于PS,这部分需要使用较多的纹理特效,2D图形学和3D数学知识,典型的如photoshop中用到的滤镜算法,卷积预算等。



补充一些PS调试的技巧:

1.在进行PS程序调试时,有时候光照结果不正确,可以试着直接返回法线,光源向量,反射向量等参数,这样很容易判别是哪里出了问题。

2.在光源向量后增加以下释义,可以在视窗中增加一个用于调接光源方向的箭头,通过交互式的方式调整一些方向向量。可在多个需要调整的向量上增加此释义,箭头的名称是释义字符串的值得,名称和向量的值得将会显示在箭头旁边。
float3 lightDir<string UIDirectional="Light Direction">={0,1,0};

EffectEdit源码:
http://files.cnblogs.com/Tue/EffectEdit.rar

中秋假期快完了,乘着整理以前写的Shader程序的时机,总结一下,希望能给大家作个参考。

2008年9月15日

转载于:https://www.cnblogs.com/Tue/archive/2008/09/15/1291150.html

相关文章:

(24):(行为型模式) Visitor 访问者模式

[所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

二十二、新人成才之路《做人七项原则 做一个节俭惜福的人》

人的福报有先天福报和后天福报。先天福报是从出生时&#xff0c;就注定的。你是个有福的人&#xff0c; 还是个福气少的人。比如出身富贵之家的孩子&#xff0c;可能天生福报较大。出身贫穷人家的孩子&#xff0c; 天生福报可能就较小。也有贫苦孩子通过奋斗努力&#xff0c;最…

代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法

(1)选中文件右键->team->update (2)选中文件右键->replace with->latest from HEAD (3)选中文件右键->team->synchronize with repository 注&#xff1a;第三种方法会以可视化的方式让用户对比本地工作目录和远程配置库中文件的区别 可以用当中的copy方法来…

SPOJ AMR10I Dividing Stones --DFS

题意&#xff1a;给n个石头&#xff0c;分成一些部分&#xff08;最多n部分&#xff0c;随便分&#xff09;&#xff0c;问分完后每部分的数量的乘积有多少种情况。 分析&#xff1a;可以看出&#xff0c;其实每个乘积都可以分解为素数的乘积&#xff0c;比如乘积为4&#xff0…

Cookie注入是怎样产生的

Cookie注入是怎样产生的 现在很多网站都加了防注入系统代码&#xff0c;你输入注入语句将无法注入~~感觉这样的防注入系统不错&#xff0c;但防注入系统没有注意到 Cookies 的问题&#xff01;所以就有了Cookies注入~~我们来研究一下怎样情况下才会有Cookies注入!如果你学过ASP…

阿里最强热修复:Sophix 超高速集成与踩坑

超高速集成 public class SophixStubApplication extends SophixApplication {private final String TAG "Sophix";// 此处SophixEntry应指定真正的Application&#xff0c;并且保证RealApplicationStub类名不被混淆。KeepSophixEntry(GowildApplication.class)stat…

安卓开发|自定义监听器的三个步骤

首先&#xff0c;要有一个实现View.OnClickListener接口的类这个类要重写onClick(View v)这个方法&#xff0c;里面加入想要触发的事件将监听器绑定在要监听的组件上&#xff0c;例如 holder.verticalLinear.setOnClickListener(MyAdapter.this);setOnClickListener的参数即为…

自己用C#写一个采集器、蜘蛛(zz)

效果图&#xff1a; 代码如下&#xff1a; usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Web;usingSystem.IO;usingSystem.Collections;usingSystem.Text.RegularExpressions;namespacechinaz { classProgram { …

DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

胡夕&#xff0c;《Apache Kafka实战》作者&#xff0c;北航计算机硕士毕业&#xff0c;现任某互金公司计算平台总监&#xff0c;曾就职于IBM、搜狗、微博等公司。国内活跃的Kafka代码贡献者。 前言虽然目前Apache Kafka已经全面进化成一个流处理平台&#xff0c;但大多数的用户…

windows程序移植linux

1&#xff0c;路径名统一用正斜杠“/”。&#xff08;windows下正反斜杠都识别&#xff0c;linux只认正斜杠。&#xff09; 2&#xff0c;统一使用UTF-8格式编码。 vim中无法保存汉字时&#xff0c;可输入下列命令&#xff1a; &#xff1a;set fileencodingprc &#xff1a;se…

完美解决方案 | 完全卸载任何版本office残余文件

采用微软官方给的卸载文件&#xff0c;注意需要能够科学上网 然后再用拼夕夕的安装包重装就能装上&#xff0c;不会提示以下 折腾好久&#xff0c;这次亲测有效 参考文章

Struts2的拦截器只允许有权限用户访问action

1、定义拦截器,继承MethodFilterInterceptor package com.life.stuts.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/*** 如果不是login的adction&#xff0c;使…

ZABBIX(八) Zabbix 通知媒介

一、zabbix报警媒介介绍zabbix触发器到了要发送通知的情况下&#xff0c;需要一个中间介质来接收并传递消息给运维。以前使用的是nagios&#xff0c;通常用脚本发送邮件或者发送飞信来达到报警。在此脚本就是一个媒介了。1、E-mail使用sendmail发送邮件&#xff0c;从这边出去的…

Office Live for Small Business--开启您创业的大门

在我印象中&#xff0c;有一段时间了&#xff0c;我一个人或是和一些朋友在一起聊天的时候&#xff0c;脑子里总是会不由自主地琢磨一个问题&#xff0c;我想这个问题或许也常常困扰很多朋友&#xff0c;那就是“房子首付从哪里来”。我不是一个习惯于伸手跟父母要钱的人&#…

webView加载不出网页的一种可能情况

我的webview的Java代码里有以下内容 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.webview);savedInstanceState getIntent().getExtras();myurl savedInstanceState.getString("url&qu…

GridView 始终显示 Pager 分页行的一种方法

GridView 是 ASP.NET 2.0 新增加的 Web 控件&#xff0c;拥有比 DataGrid 更多的扩展和改进。使用 GridView 可以很容易的实现数据分页&#xff0c;但是遗憾的是&#xff0c;在缺省情况下&#xff0c;当仅有一页数据时&#xff0c; GridView 不显示 Pager 分页行&#xff0c;这…

php 几十万数据导出到csv

2019独角兽企业重金招聘Python工程师标准>>> 参考资料 &#xff1a; https://blog.csdn.net/tim_phper/article/details/77581071 https://www.imooc.com/wenda/detail/316785 /*** 下载/导出到csv文件* param $title 标题栏标题* param $data : array($count M(表…

恍然大悟之原、反、补

曾在很多书籍中看到过关于原码、反码和补码的介绍&#xff0c;都未能够深入理解。今在Richard Blum编写的《汇编语言程序设计》一书中读到关于带符号整数一节的讲解时&#xff08;确切的说是其中的一句话&#xff09;&#xff0c;的确有茅塞顿开、恍然大悟之感。原文如下&#…

Android中的多线程(字节跳动)

文章目录Handler机制(Android中的消息队列机制)Handler机制为Android系统解决了以下两个问题Handler常用方法Handler的使用补充知识点Handler原理辨析Runnable/Message扩展知识&#xff1a;ANRHandler总结Android中的多线程概念&#xff1a;进程与线程(Process and Thread)Andr…

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator

一、前言 利用FPGA设计算法一直以来都是热点&#xff0c;同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建&#xff0c;在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen&#xff08;system generator&#xff09;工具扩展了MATLAB的simul…

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况

前言&#xff1a; 帮客户做一个订单系统&#xff0c;需要一个日期1&#xff0c;一个日期2&#xff0c;默认情况下日期1为当天&#xff0c;日期2为明天&#xff0c;只是当时有些疑惑的是日期2偶尔会出现NAN的情况&#xff0c;今天在segmentfault.com看到了同样的问题&#xff0c…

VCL 中的 Windows API 函数(6): BeginDeferWindowPos

BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.本例效果图:代码文件:unit Un…

base64格式的图片数据如何转成图片

base64格式的图片数据如何转成图片 一、总结 一句话总结&#xff1a;不仅要去掉前面的格式串&#xff0c;还需要base64_decode&#xff08;&#xff09;解码才行。 1 // $base_img是获取到前端传递的值2 $base_img str_replace(data:image/jpg;base64,, , $base_img);3 // 设…

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象&#xff0c;而赋值运算符不能。 2.由于拷贝构造函数是直接构造一个新的类对象&#xff0c;所以在初始化这个对象之前不用检验源对象是否和新对…

代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析

1.以类取代类型码 适用情况&#xff1a;类之中有一个数值类型码&#xff0c;但它并不影响类的行为。 重构手段&#xff1a;以一个新的类替换该数值类型码。 重构类图示意&#xff1a; 这里的“不影响类的行为”是什么意思呢&#xff1f; 类型码往往和switch语句一起出现&#…

NHibernate之旅(11):探索多对多关系及其关联查询

本节内容 多对多关系引入多对多映射关系多对多关联查询1.原生SQL关联查询2.HQL关联查询3.Criteria API关联查询结语多对多关系引入 让我们再次回顾在第二篇中建立的数据模型&#xff1a; 在图上&#xff0c;我已经清晰的标注了表之间的关系&#xff0c;上两篇分析Customer和Ord…

自动化运维—saltstack

2019独角兽企业重金招聘Python工程师标准>>> 自动化运维——saltstack 、ansible 一、自动化运维介绍 传统运维&#xff1a;传统运维效率低&#xff0c;大多工作需要人工完成&#xff0c;工作繁琐&#xff0c;容易出错&#xff0c;每日重复做相同的事情&#xff0c;…

史上最浅显易懂的Git教程!

Git初学者很好的一篇教程 mark : ) http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 转载于:https://www.cnblogs.com/anthony0859/p/3900327.html

狎昵关系和依恋情结辨诠

Inappropriate Intimacy&#xff08;狎昵关系&#xff09; 表现&#xff1a;两个classes过于亲密&#xff0c;花费太多时间去探究彼此的private成分 解决&#xff1a;你可以采用 Move Method 和 Move Field 帮它们划清界线&#xff0c;从而减少狎昵行径。你也可以看看是否运用…