64,671
社区成员
发帖
与我相关
我的任务
分享
extern matrix g_matWorldViewProj;
extern matrix g_matWorldView;
extern vector g_vLightDirection;
extern vector g_vColor;
struct VS_INPUT
{
vector pos:POSITION;
vector normal:NORMAL;
};
struct VS_OUTPUT
{
vector pos:POSITION;
float2 tex:TEXCOORD;
vector color:COLOR;
};
VS_OUTPUT Main(VS_INPUT input)
{
VS_OUTPUT output=(VS_OUTPUT)0;
output.pos=mul(input.pos,g_matWorldViewProj);
vector vLightDirection=g_vLightDirection;
vLightDirection.w=0.0f;
input.normal.w=0.0f;
vLightDirection=mul(vLightDirection,g_matWorldView);
input.normal=mul(input.normal,g_matWorldView);
float fTemp=dot(vLightDirection,input.normal);
if(fTemp<0.0f)
fTemp=0.0f;
output.tex.x=fTemp;
output.tex.y=0.5f;
output.color=g_vColor;
return output;
}
extern matrix g_matProj;
extern matrix g_matWorldView; //待会着重注意这个地方,会发生变化。
static vector g_vColor={0.0f,0.0f,0.0f,0.0f};
struct VS_INPUT
{
vector pos:POSITION;
vector normal:NORMAL0;
vector facenormal1:NORMAL1;
vector facenormal2:NORMAL2;
};
struct VS_OUTPUT
{
vector pos:POSITION;
vector color:COLOR;
};
VS_OUTPUT Main(VS_INPUT input)
{
VS_OUTPUT output=(VS_OUTPUT)0;
input.pos=mul(input.pos,g_matWorldView);
vector vTempPos=input.pos;
input.normal.w=input.facenormal1.w=input.facenormal2.w=0.0f;
input.normal=mul(input.normal,g_matWorldView);
input.facenormal1=mul(input.facenormal1,g_matWorldView);
input.facenormal2=mul(input.facenormal2,g_matWorldView);
if(dot(vTempPos,input.facenormal1)*dot(vTempPos,input.facenormal2)<0.0f)
input.pos+=input.normal*0.1f; //待会着重注意这个地方,会发生变化。
output.pos=mul(input.pos,g_matProj);
output.color=g_vColor;
return output;
}
void CVSDemo::Render()
{
if(m_d3dDevice)
{
m_d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
m_d3dDevice->BeginScene();
m_d3dCamera->SetViewMatrix(); //这只是用来进行场景漫游,不影响问题
m_matView=m_d3dCamera->GetViewMatrix();
D3DXHANDLE hShaderVar=NULL;//着色器变量句柄
D3DXMATRIX matWorldView,matWorldViewProj;
D3DXMATRIX matWorld;
//可编程流水线绘制卡通茶壶
D3DXVECTOR4 vColor(1.0f,0.0f,0.0f,1.0f);
D3DXMatrixTranslation(&matWorld,2.0f,0.0f,0.0f);
matWorldView=matWorldView=matWorld*m_matView;
matWorldViewProj=matWorldView*m_matProj;
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_matWorldView");
m_ppd3dConstTable[0]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldView);
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_matWorldViewProj");
m_ppd3dConstTable[0]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldViewProj);
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_vColor");
m_ppd3dConstTable[0]->SetVector(m_d3dDevice,hShaderVar,&vColor);
//这里也需要注意一下, 我在进行轮廓勾勒前已经有代码对轮廓边的顶点着色器的常量表进行设置
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_matWorldView");
m_ppd3dConstTable[1]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldView);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//这里待会要注意,会发生变化!!!!!!!!!!!!!!!!!
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
m_d3dDevice->SetFVF(0);
//卡通着色
m_d3dDevice->SetVertexShader(m_ppd3dVertexShader[0]);
m_d3dDevice->SetTexture(0,m_pd3dTexture);
m_pd3dMesh->DrawSubset(0);
m_d3dDevice->SetTexture(0,NULL);
m_d3dDevice->SetVertexShader(NULL);
//勾勒轮廓
//这里待会要注意一下,会发生变化!!!!!!!!!!!!
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_matProj");
m_ppd3dConstTable[1]->SetMatrix(m_d3dDevice,hShaderVar,&m_matProj);
//////////////////////////////////////////////////
m_d3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
m_d3dDevice->SetVertexShader(m_ppd3dVertexShader[1]);
m_d3dDevice->SetVertexDeclaration(m_pd3dVertexDecl);
m_d3dDevice->SetStreamSource(0,m_pd3dVertexBuffer,0,sizeof(EdgeVertex));
m_d3dDevice->SetIndices(m_pd3dIndexBuffer);
m_d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,m_uiVerts,0,m_uiFaces);
m_d3dDevice->SetVertexShader(NULL);
m_d3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
//打印坐标
//这里为了节约字数我删除了
//////////
m_d3dDevice->EndScene();
m_d3dDevice->Present(NULL,NULL,0,NULL);
}
}
dir.Direction=D3DXVECTOR3(-0.5f,-0.707f,0.5f);
//卡通可编程流水线
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_vLightDirection");
m_ppd3dConstTable[0]->SetVector(m_d3dDevice,hShaderVar,&(D3DXVECTOR4)(D3DXVECTOR3)dir.Direction);
extern matrix g_matProj;
extern matrix g_matWorldView;
extern float g_fWidth; //注意这个地方,我增加了一个宽度,是想让轮廓边的宽度可变。
static vector g_vColor={0.0f,0.0f,0.0f,0.0f};
struct VS_INPUT
{
vector pos:POSITION;
vector normal:NORMAL0;
vector facenormal1:NORMAL1;
vector facenormal2:NORMAL2;
};
struct VS_OUTPUT
{
vector pos:POSITION;
vector color:COLOR;
};
VS_OUTPUT Main(VS_INPUT input)
{
VS_OUTPUT output=(VS_OUTPUT)0;
input.pos=mul(input.pos,g_matWorldView);
vector vTempPos=input.pos;
input.normal.w=input.facenormal1.w=input.facenormal2.w=0.0f;
input.normal=mul(input.normal,g_matWorldView);
input.facenormal1=mul(input.facenormal1,g_matWorldView);
input.facenormal2=mul(input.facenormal2,g_matWorldView);
if(dot(vTempPos,input.facenormal1)*dot(vTempPos,input.facenormal2)<0.0f)
input.pos+=input.normal*g_fWidth; //这里也相应地发生了变化
output.pos=mul(input.pos,g_matProj);
output.color=g_vColor;
return output;
}
void CVSDemo::Render()
{
if(m_d3dDevice)
{
m_d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
m_d3dDevice->BeginScene();
m_d3dCamera->SetViewMatrix();
m_matView=m_d3dCamera->GetViewMatrix();
D3DXHANDLE hShaderVar=NULL;//着色器变量句柄
D3DXMATRIX matWorldView,matWorldViewProj;
D3DXMATRIX matWorld;
//可编程流水线绘制卡通茶壶
D3DXVECTOR4 vColor(1.0f,0.0f,0.0f,1.0f);
D3DXMatrixTranslation(&matWorld,2.0f,0.0f,0.0f);
matWorldView=matWorldView=matWorld*m_matView;
matWorldViewProj=matWorldView*m_matProj;
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_matWorldView");
m_ppd3dConstTable[0]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldView);
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_matWorldViewProj");
m_ppd3dConstTable[0]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldViewProj);
hShaderVar=m_ppd3dConstTable[0]->GetConstantByName(NULL,"g_vColor");
m_ppd3dConstTable[0]->SetVector(m_d3dDevice,hShaderVar,&vColor);
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_matWorldView");
m_ppd3dConstTable[1]->SetMatrix(m_d3dDevice,hShaderVar,&matWorldView);
//这里需要注意,我对添加的顶点着色器全局变量进行设置,并更改了另一个全局变量在程序中的位置
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_fWidth");
m_ppd3dConstTable[1]->SetFloat(m_d3dDevice,hShaderVar,0.1f);
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_matProj");
m_ppd3dConstTable[1]->SetMatrix(m_d3dDevice,hShaderVar,&m_matProj);
//////////////////////////////////////////////////////////////////
m_d3dDevice->SetFVF(0);
//卡通着色
m_d3dDevice->SetVertexShader(m_ppd3dVertexShader[0]);
m_d3dDevice->SetTexture(0,m_pd3dTexture);
m_pd3dMesh->DrawSubset(0);
m_d3dDevice->SetTexture(0,NULL);
m_d3dDevice->SetVertexShader(NULL);
//勾勒轮廓
m_d3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
m_d3dDevice->SetVertexShader(m_ppd3dVertexShader[1]);
m_d3dDevice->SetVertexDeclaration(m_pd3dVertexDecl);
m_d3dDevice->SetStreamSource(0,m_pd3dVertexBuffer,0,sizeof(EdgeVertex));
m_d3dDevice->SetIndices(m_pd3dIndexBuffer);
m_d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,m_uiVerts,0,m_uiFaces);
m_d3dDevice->SetVertexShader(NULL);
m_d3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
//打印坐标
//这里为了节约字数我删除了。
//////////
m_d3dDevice->EndScene();
m_d3dDevice->Present(NULL,NULL,0,NULL);
}
}
hShaderVar=m_ppd3dConstTable[1]->GetConstantByName(NULL,"g_matProj");
m_ppd3dConstTable[1]->SetMatrix(m_d3dDevice,hShaderVar,&m_matProj);