在搞d3d渲染的c#封装
在做到画线,光照测试时都没问题
然后接下来加了个画billboard,就崩溃了,把画billboard的代码去掉,发现原来的单单画线也不行了
本来打算搞完billboard来个版本备份的。
但上一个版本还原后测试没有问题
具体状况就是bedraw 然后bhdraw刚弹出来就崩溃
Win32.MsgBox("bedraw");
dc.Draw(Length,0);
Win32.MsgBox("bhdraw");
问题事件名称: APPCRASH
应用程序名: doticworks.UtiliFx.Run.exe
应用程序版本: 1.7.3.37621
应用程序时间戳: 610d30ea
故障模块名称: nvwgf2um.dll
故障模块版本: 21.21.13.4201
故障模块时间戳: 5829879d
.NET事件记录器只写了“由于未经处理的异常”没有具体信息。ide也是直接退出调试
在期间大概干了这些事:
1.texture类加了个长宽缓存
public Texture(int w,int h,bool NeedResize=false):base(GraphicsDevice._[0])
{
ndResize=NeedResize;
t2d=GraphicsDevice._[0].CreateTexture2D(w,h);
tw=w;th=h;
}
int tw=0,th=0;
public int Width{get{return tw;}}
public int Height{get{return th;}}
加了个内嵌的hlsl billboardshader
Texture2D ShaderTexture:register(t0);
SamplerState SampleType:register(s0);
cbuffer CAM:register(b0){
matrix View;
matrix Proj;
};
cbuffer TR:register(b1){
matrix World;
};
struct VertexIn{
float3 Pos:POSITION;
float2 Tex:TEXCOORD;
};
struct VertexOut{
float4 Pos:SV_POSITION;
float2 Tex:TEXCOORD;
};
VertexOut VS(VertexIn ina){
VertexOut outa;
outa.Pos=mul(float4(ina.Pos,1.0f),World);
outa.Pos=mul(outa.Pos,View);
outa.Pos=mul(outa.Pos,Proj);
outa.Tex=ina.Tex;
return outa;
}
float4 PS(VertexOut outa):SV_Target{
float4 texc;
texc=ShaderTexture.Sample(SampleType,outa.Tex);
if(texc.a==0){
clip(-1);
}
texc=saturate(texc);
return texc;
}
以及与billboardshader配套的c#类
public class BillBoard{
public BillBoard(Texture tex,float size=0.1f,Sampler sam=null){//,RenderD3v7 host=null
ShaderBillboard.BBIN tmp=new ShaderBillboard.BBIN();
var tmw=tex.Width*0.5f*size;var tmh=tex.Height*0.5f*size;
tmp.TEXCOORD=new Vector2(1,0);tmp.POSITION=new Vector3(-tmw,tmh,0);ve.Add(tmp);
tmp.TEXCOORD=new Vector2(0,0);tmp.POSITION=new Vector3(tmw,tmh,0);ve.Add(tmp);
tmp.TEXCOORD=new Vector2(1,1);tmp.POSITION=new Vector3(-tmw,-tmh,0);ve.Add(tmp);
tmp.TEXCOORD=new Vector2(0,1);tmp.POSITION=new Vector3(tmw,-tmh,0);ve.Add(tmp);
mb=new MeshBuffer(new uint[]{0,1,2,3,2,1,2,1,0,1,2,3});
if(sam!=null){
smx=sam;
}else{
smx=new Sampler(Color.Transparent.ToColor4());
}
tmx=tex;
}
public void DrawAt(Vector3 pos,Transform viewtr){
RenderD3v7._[0]._SetShader(ShaderBillboard._[0]);
ShaderBillboard._[0].BillBoardAt(this,pos,viewtr);
}
public Texture tmx;
public Sampler smx;
public VertexBuffer<ShaderBillboard.BBIN> ve=new VertexBuffer<ShaderBillboard.BBIN>();
public MeshBuffer mb;
}
public class ShaderBillboard:Shader7,ICameraShader
{
public static Runtime.Instances<ShaderBillboard> _=new Runtime.Instances<ShaderBillboard>(() => new ShaderBillboard(RenderD3v7._[0]));
public ShaderBillboard(RenderD3v7 rdx):base(rdx,typeof(BBIN),
IO.Assetor._[0].Getstring("Gfx:doticworks.UtiliFx.Asset.Shader.ShaderBillboard.hlsl",System.Text.Encoding.UTF8),"VS","PS"){
cam=MapCBuffer<ICameraBuffer>(0,CBufferHostShader.VertexShader);
tr=MapCBuffer<Matrix>(1,CBufferHostShader.VertexShader);
}
public void ICamera(Matrix view,Matrix proj){
var tmp=new ICameraBuffer();tmp.view=view.Transpose();tmp.proj=proj.Transpose();//特别注意!!! 假如这里没有transpose 那hlsl里就要逆乘. 为统一,选择这里transpose
cam.Update(tmp);
}
public void BillBoardAt(Objects.BillBoard b,Vector3 pos,Transform viewtr){
SetTexture(b.tmx,0);
SetSampler(b.smx,0);
var world= (Matrix.BillboardLH(pos,viewtr.Position,Vector3.UnitY,viewtr.Rotation)).Transpose();
tr.Update(world);
rd._Draw(b.ve,b.mb);
}
CBuffer<ICameraBuffer> cam;
CBuffer<Matrix> tr;
public struct BBIN{
public Vector3 POSITION;
public Vector2 TEXCOORD;
}
}