第1步:检查对像素着色器的支持。 第2步:声明顶点数据。 第3步:设计像素着色器。 第4步:创建像素着色器。第5步:渲染输出像素。 如果读者已经知道如何构建并运行Direct3D示例,那么可以从本示例中复制代码并粘贴到已有的应用程序中。 要检查对像素着色器的支持,应该使用以下代码。这个例子检查1.1版本的像素着色器。
D3DCAPS9 caps
m_pd3dDevice->GetDeviceCaps(&caps)// 使用m_pd3dDevice前要进行初始化
if( caps.PixelShaderVersion <D3DPS_VERSION(1,1) )
return E_FAIL
caps结构会返回硬件可用的能力。要用D3DPS_VERSION宏检查当前硬件支持的所有着色器版本。如果caps返回的版本小于1.1,那么这个调用会失败。反之,对所有大于或等于1.1的版本,调用会成功。如果硬件不支持被测试的着色器版本,那么应用程序将不得不退而使用别的渲染方法(也许可以使用一个较低版本的着色器)。 这个示例使用了一个四边形,由两个三角形组成。每个顶点的数据结构包含了位置和漫反射色数据。D3DFVF_CUSTOMVERTEX宏定义了与顶点数据相匹配的数据结构。实际的顶点数据在全局数组g_Vertices中声明。四个顶点以原点为中心,每个顶点具有不同的漫反射色。
// 声明顶点数据结构。
struct CUSTOMVERTEX
{
FLOAT x, y, z
DWORD diffuseColor
}
// 声明自定义FVF宏。
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
// 声明顶点位置和漫反射色数据。
CUSTOMVERTEX g_Vertices[]=
{
// x y z 漫反射色
{ -1.0f, -1.0f, 0.0f, 0xffff0000 }, // 红 – 左下
{ +1.0f, -1.0f, 0.0f, 0xff00ff00 }, // 绿 – 右下
{ +1.0f, +1.0f, 0.0f, 0xff0000ff }, // 蓝 – 右上
{ -1.0f, +1.0f, 0.0f, 0xffffffff }, // 白 – 左上
}
第3步
这个着色器把经过高洛德插值的漫反射色数据复制到输出像素。着色器文件PixelShader.txt如下所示:
ps_1_1 // 版本指令
mov r0,v0 // 把顶点的漫反射色复制到输出寄存器。
像素着色器文件的第一条指令声明了像素着色器的版本,此处为1.1。
第二条指令把颜色寄存器(v0)的内容复制到输出寄存器(r0)。因为在第1步中声明的顶点数据已经包含了经过插值的漫反射色,所以颜色寄存器包含了顶点的漫反射色。输出寄存器决定渲染目标使用的像素颜色(因为本例中没有更多的处理,如雾,所以输出寄存器就是最终的像素颜色)。 像素着色器由像素着色器指令创建。本例中,指令被包含在一个单独的文件中。指令也可以被包含在一个文本字符串中。
LPD3DXBUFFER pCode // 存放经过汇编的着色器代码的缓存
LPD3DXBUFFER pErrorMsgs // 存放错误信息的缓存
TCHAR strPixelShaderPath[512]// 用来定位着色器文件
DXUtil_FindMediaFileCb( strPixelShaderPath, sizeof(strPixelShaderPath),
_T(PixelShader.txt) )
这个函数是示例框架使用的一个辅助函数,许多示例都以它为基础。
LPDIRECT3DPIXELSHADER9 m_pPixelShader
D3DXAssembleShaderFromFile( strPixelShaderPath, NULL, NULL, 0,
&pCode, &pErrorMsgs, NULL )
m_pd3dDevice->CreatePixelShader( (DWORD*)pCode->GetBufferPointer(),
&m_pPixelShader )
着色器创建完成后,指针m_pPixelShader用来对它进行引用。 除了用像素着色器句柄来设置着色器外,渲染输出像素的过程和使用固定功能流水线类似。
// 在本例中关闭光照。它不会对最终像素的颜色产生影响。
// 像素颜色完全由经过插值的顶点颜色决定。
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE )
m_pd3dDevice->SetStreamSource( 0, m_pQuadVB, sizeof(CUSTOMVERTEX) )
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX )
m_pd3dDevice->SetPixelShader( m_pPixelShader )
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 )
源顶点数据由SetStreamSource设置。本例中,SetFVF使用在声明顶点数据时定义的FVF码告诉Direct3D进行固定功能顶点处理。顶点着色器和像素着色器既可以一起使用,也可以分开使用。可以用固定功能流水线代替这两者。SetPixelShader设置像素着色器,而DrawPrimitive则绘制四边形。
确认对像素着色器的支持
应用程序可以查询D3DCAPS9的成员以确定硬件对像素着色器所涉及的 *** 作的支持程度。下表列出了与可编程像素处理有关的设备能力。 设备能力 描述 PixelShader1xMaxValue 寄存器中可存储的值的范围为[-PixelShader1xMaxValue, PixelShader1xMaxValue]。这个值只对版本1.1到1.4有效。 MaxSimultaneousTextures 用于固定功能流水线,纹理取样器的数量为MaxTextureBlendStages除以MaxSimultaneousTextures。用于像素着色器的纹理取样器的数量在接下来的表中显示。 PixelShaderVersion 硬件支持的像素着色器的版本。版本号小于或等于该值的像素着色器被支持。 可用于像素着色器的纹理取样器的数量取决于像素着色器的版本。 像素着色器版本 纹理取样器的数量 ps_1_1 - ps_1_3 4个纹理取样器 ps_1_4 6个纹理取样器 ps_2_0 - ps_3_0 16个纹理取样器 Fixed function pixel shader MaxTextureBlendStages/MaxSimultaneousTextures个纹理取样器 PixelShaderVersion的第一个字节包含次版本号,第二个字节包含主版本号。经过汇编的着色器的第一个标记就是像素着色器的版本。每种硬件实现都会设置该版本号,表示它能完全支持的像素着色器的最高版本。
纹理 *** 作的转换
像素着色器在以下几个方面扩展并一般化了Microsoft DirectX&reg6.0和7.0的多重纹理能力。
加入了一组通用读/写寄存器,这样就允许更为灵活的表达式。用D3DTA_CURRENT的连续级联需要为每层指定一个单独的结果寄存器参数。 D3DTOP_MODULATE2X和D3DTOP_MODULATE4X纹理 *** 作被分成了单独的修饰符,可用于任何指令。这样就无需单独的D3DTOP_MODULATE和D3DTOP_MODULATE2X *** 作了。 乘加 *** 作加入了可选的第三个参数,因此程序化的像素着色器可以执行arg1 ×arg2 + arg0的 *** 作。这样就不再需要D3DTOP_MODULATEALPHA_ADDCOLOR和D3DTOP_MODULATECOLOR_ADDALPHA 纹理 *** 作了。 混合 *** 作加入了可选的第三个参数,因此程序化的像素着色器可以用arg0作为arg1和arg2之间的混合比。这样就不再需要D3DTOP_BLENDDIFFUSEALPHA, D3DTOP_BLENDTEXTUREALPHA, D3DTOP_BLENDFACTORALPHA, D3DTOP_BLENDTEXTUREALPHAPM, 和D3DTOP_BLENDCURRENTALPHA纹理 *** 作了。 对纹理寻址的修改 *** 作,如D3DTOP_BUMPENVMAP,被从颜色和阿尔法 *** 作中分离出来并作为第三种 *** 作类型,专门用于纹理寻址 *** 作。 为了有效地支持这种新增的灵活性,API的语法从DWORD对改成了ASCII汇编代码语法。这样就暴露了程序化的像素着色器所提供的功能。
注意在使用像素着色器时,镜面反射加法不专门由一个渲染状态控制,如果需要,这可能由像素着色器实现。但是,雾混合仍然由固定功能流水线执行。
对纹理的一些考虑
像素着色器完全取代了由Microsoft DirectX&reg6.0和7.0的多重纹理API提供的像素混合功能,尤其是那些由D3DTSS_COLOROP, D3DTSS_COLORARG1, D3DTSS_COLORARG2, D3DTSS_ALPHAOP, D3DTSS_ALPHAARG1和D3DTSS_ALPHAARG2纹理层状态、相关的参数和修饰符定义的 *** 作。如果设置了程序化的像素着色器,那么这些状态会被忽略。
能保存的。EVE中编辑的命令在设置里面就能保存。
EVE设置保存方法:1、使捷方法,在(盘搜索CCP,注背点上高级选项中搜索隐文件和文件夹的选项,之后就能找到V自定义文件的存储路径。路径为C:\Documents and SettingsAdministrator\Local Settings Application Data。将CCP备份即可。(注意:文件夹是隐藏属性,此外上述路径中Administrator在不同机器上略有区别,是你机器当前登录帐户的名称。另外,上述路径在VISTA中稍有区别)。
2、CCP/eve当中的自定文件分两类:settings和cache。而cache当中多是缓存文件,若嫌麻烦可以只备份setting中各个文件,此法本人已经测试有效,可免去再设麻烦,更可以转移自己设置到不同电脑上玩FVF,如果多出现一个文件夹,名字叫cache backup0,那是因为游戏中"清除所有缓存文件”备份用,可以留下或手动清除。
3、在CCP\eve当中还有historv.txt文件,里面都是客户端的启动关闭记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)