HLSL着色器,如何用它的原始颜色绘制模型?
我使用Google SketchUp将这个非常简单的3D模型导出为.x格式,模型是一个简单的立方体,没有纹理,每个面部只有不同的颜色。
我编写了这个HLSL代码试图用它的原始颜色渲染这个模型,但它不起作用,我在调用ModelMesh.Draw()方法时得到一个
"The current vertex declaration does not include all the elements required by the current vertex shader. Color0 is missing"
。这是我的HLSL代码:
float4x4 World;
float4x4 View;
float4x4 Projection;
struct AppToVertex
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
struct VertexToPixel
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
VertexToPixel ColoredVS(AppToVertex input)
{
VertexToPixel output = (VertexToPixel)0;
float4 iTransformed = mul(input.Position, World);
float4 iView = mul(iTransformed, View);
float4 iProjection = mul(iView, Projection);
output.Position = iProjection;
output.Color = input.Color;
return output;
}
float4 ColoredPS(VertexToPixel input) : COLOR
{
return input.Color;
}
technique Colored
{
pass Pass0
{
VertexShader = compile vs_2_0 ColoredVS();
PixelShader = compile ps_2_0 ColoredPS();
}
}
这可能是一个菜鸟问题,我知道我可以通过简单地使用BasicEffect类(它可以工作)来绘制这个模型,但我这样做只是为了学习HLSL,到目前为止我能做的就是绘制在整个模型中着色器中定义的另一种颜色的模型:[
没有找到相关结果
已邀请:
1 个回复
泪琉踞檄
看看模型的.X'声明',我可以看到网格的几何形状,颜色和通道等颜色。法线等存储为单独的“对象”(就像它们在XNAs内容管道中的DOM中一样)。 虽然你的模型有位置数据(Mesh),普通数据(MeshNormals)和纹理坐标(MeshTextureCoords)(都在模板部分下面定义)的定义,但我看不到MeshVertexColors类型的部分。 相反,它似乎定义了四个材质,并使用了应用于模型面
部分。 因此,您没有要导入的ModelProcessor或要显示的着色器的任何顶点颜色。 Sketchup中可能有一个选项可用于启用顶点颜色。但是,如果您无法找到/不想查找它,则可以通过在内容管道扩展项目中创建内容处理器来在内容管道中添加和删除顶点通道。 (我知道这听起来真的很不愉快,但实际上,当你习惯它时,这是一个非常好的功能!) 网上有很多关于此的教程,但简而言之: 进入VS,右键单击,添加新项目>内容管道扩展库 在该新项目中,添加一个新的内容处理器项,类似于下面的内容。 重新编译,然后在内容项目中的模型.X文件条目的内容处理器字段中,选择新的导入程序(通过在DisplayName属性中给出的名称) 这样做基本上是在将.X数据导入XNAs文档对象模型后拦截它的数据,在将其处理成新的Model类之前,处理器会检查是否存在顶点颜色通道,如果有的话在ModelProcessor创建VertexDeclaration并将所有顶点数据打包到要由GPU加载的VertexBuffer之前,未找到,生成并添加它。 这只是将立方体显示为纯紫色,但至少可以看到着色器是否正常工作。
祝你好运,对不起,如果你已经了解了大部分内容,我想如果你正在编写自己的着色器,你可能知道所有关于管道修改的东西,但更安全:) 编辑:只是关于System.Diag ...行的一个注释,如果你进入调试器,请确保你在完成探索时点击F5并让它运行它的路线,否则它需要你的主VS窗口当它退出时 - 当你忘记评论它时,这不是一个真正烦人的问题;)