.Steve 2021-08-06 21:13 采纳率: 0%
浏览 15
已结题

DirectX11 调用 devicecontext.Draw 就闪退 事件日志里也没具体错误

在搞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;
        }
    }

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月14日
    • 创建了问题 8月6日

    悬赏问题

    • ¥15 ETLCloud 处理json多层级问题
    • ¥15 matlab中使用gurobi时报错
    • ¥15 这个主板怎么能扩出一两个sata口
    • ¥15 不是,这到底错哪儿了😭
    • ¥15 2020长安杯与连接网探
    • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
    • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
    • ¥15 可见光定位matlab仿真
    • ¥15 arduino 四自由度机械臂
    • ¥15 wordpress 产品图片 GIF 没法显示