Shader学习之旅:RenderMonkey初体验以及基本使用方法

来源:互联网 发布:域名备案进度查询 编辑:程序博客网 时间:2024/06/10 01:43

ShaderMonkey是一个用来学习Shader编程的工具,现在已经不更新了,版本停留在08年的,不过用作学习的话ShaderMonkey足够,传送门。


第一次使用这个,先来看一下主要的界面:



可能会发现主要的界面与VS十分相似,的确十分相似。一般来说主要的workspace添加代码和资源就可以。


那么以创建一个茶壶并且贴上纹理为例,来逐渐学习这个工具吧。撒,哈继马路哟!


1. 茶壶创建

右键点击Effect Workspace,选择Add Effect Group -> Empty Effect Group,这样一来就创建了一个Group,可选进行重命名,我命名为NoahZuo_Demo。


然后就需要添加Effect,有几个是可选的,分别是Directx, OpenGL和OpenGL ES,这里我们选择Directx。重命名Effect为Shading_DEMO_00。


选择之后会发现系统自动帮你把一些东西都布置好了,为了加强理解,我们把这下面的东西都删掉,自己配置一遍。


在一个Shading编程中,一定需要一个矩阵变量命名为matViewProjection,这个很好理解,3D中的场景一定需要投影到2D的平面中,这个矩阵是一定需要的,添加方法:右键点击Effect -> Add Variable -> Matrix -> Predefined->matViewProjection,这样一来就设置好了投影矩阵。


还有一个很重要的东西叫StreamMapping,它决定了顶点的格式,最简单的顶点至少要有位置信息。好吧说道顶点格式就多说一点,在directx中的顶点格式是一个static变量,用于在创建顶点缓存的时候决定顶点的格式和渲染的时候决定哪些东西需要计算以及插值。加入streamMapping的方法很简单:右键点击Effect -> Add Stream Mapping 就行了,双击看看现在只有Position信息。


此外,想要显示一个模型就一定要有一个模型,就好比想要摸女朋友的头首先要有个女朋友一样(唉说着说着忽然好想哭是怎么回事)。我们得先导入一个模型,右键点击Effect -> Add Model -> Model,然后双击已经生成的Model,选择Teapot即可。


上面是添加需要的材料,现在需要添加Pass,Pass这个东西我也不知道该翻译成什么东西,就叫Pass吧。右键点击Effect -> Add Pass。


会发现现在多了一个Pass层,已经配好了东西,但是我们还是全部删掉,自己来配一遍加深印象吧。


右键点击Pass-> Add Model Reference -> Teapot,这是为了在这个Pass中引用在全局设定的Teapot。


右键点击Pass -> Add Stream Mapping Reference -> Stream Mapping,这个也是一个Stream Mapping的引用,不解释了吧。


右键点击Pass ->Add Vertex Shader,这是顶点着色器,弄完这个应该能看到一个白色的茶壶。


右键点击Pass ->Add Pixel Shader,这是像素着色器,弄完这个应该能看到一个红色的茶壶。


现在我们打开Vertex Shader,看见里面已经有了一些东西。这个看起来还是比较简单的吧,实现的东西实际上就是实现一个Projection效果,没啥好说的。


打开Pixel Shader, 看见里面返回的是一个颜色,RGBA的顺序排列,可以尝试一下更改颜色,就能改变茶壶的颜色了,我在这里改成黄色。


2. 还记得当初我们的约定吗?没错,要贴纹理的。下面实现如何贴纹理。


首先要更改顶点格式,一开始的顶点格式只有位置,现在要添加纹理坐标的性质了。双击Stream Mapping,点击Add,Usage选择TEXCOORD确定就可以了


然后要导入纹理,右键点击Effect->Add Texture -> Add 2D Texture,然后选择要导入的纹理,命名为Stone,这个就不用太多解释了吧。


然后是对于Pass的处理,右键点击Pass ->Add Texture Object ->你导入的纹理,这样是为了引用导入的全局纹理。


然后要更改相应Shader,打开VertexShader,对于输入格式和输出格式来说,都加入

float2 Tex: TEXCOORD0;
这个就代表了在输入和输出的结构中都有纹理坐标的信息。然后在main函数中加入

Output.Tex = Input.Tex;
这个是代表了把输入的纹理坐标作为输出的纹理坐标。

打开PixelShader,首先在最前面加入

sampler Stone;
这个代表采用这个纹理,然后在ps_main的括号函数中加入:

float4 InDiffuse: COLOR0, float2 Cor: TEXCOORD0
这个代表输入的有漫反射颜色和纹理坐标,要返回当前纹理这个坐标的颜色,使用tex2D函数,使用如下的代码:

return( tex2D(Stone, Cor ));
这样就完成了纹理贴图,效果如下。


啊啊啊,总算弄完了,休息一会复习去!

0 0