d3d 零碎记录

 

本文记录

  • pc版directx相关coding的一些知识点
  • 摘取directx doc中需要更加注意的地方

driver:

 

从render target读东西,目前为止知道的方法是

1, 创建system memory的surface,然后用D3DXLoadSurfaceFromSurface把rendertarget的东西load到surface里面。

然后就可以lock了。

 

其他lock需要是非render target的surface。

2, strechrect 

文档上可以,但是还没尝试过,用default memory的surface把surface copy过来,然后lock

 

3, GetRenderTargetData

这个可以把rendertarget 的surface从default memory copy到system memory的surface,而且这个是走command buffer的,用一个query event来控制结束点比较好,防止还没完成就用了。

 

batch:

每个drawcall时候driver会validate render state changes。

 

RenderTarget&Texture:

刚才在setrendertarget的时候depth buffer大小和color buffer不一致,居然还可以跑。

 

经楼下提示,查了下文档,果然是要求depth buffer要>=color buffer(“The size of the depth stencil surface must be greater than or equal to the size of the render target.”)。

 

 

rgbx在lock的时候内存分布是bgra:用union来做的话就是第一个byte为blue,第二个byte为green这种

 

RenderTarget的color buffer至少要有一个,不能全设成NULL,我全设成NULL的情况下是用之前的一个render target,结果resolution不一样,导致render有问题。

如果不需要写入的话,就选择一个resolution一样的,然后disable color writing就好。

 

在设置render target的同时会默认设置viewport为全屏。

 

Lock

  • dynamic属性的texture一般是放在agp memory里的。
  • discard的效率最好,但是内存不会被保留,所以如果只更新一部分的话,有可能会看见其余部分被改写。
  • 如果lock的东西正在被用,cpu端就要wait(当然用了nowait的flag的话,可以得到busy的信息,然后做别的)

OS

  • xp下d3d driver拥有gpu的所有控制权
  • vista下是把一部分工作(scheduling,memory management)

resource management:

  • 很多资源是第一次使用的时候才会被创建的,而不是api的create的时候
  • texture's creation/destruction都是很昂贵的,不只是memory allocation,还有很多check,所以可以的话还是pool之。

recompile on g7x shader

  • user defined clip plane会导致shader重编译
  • alpha test在g7x会导致shader重新编译

Instancing:

  • instancing对cpu有好处,对gpu没好处,项目根据自己情况取舍吧。

machine code

  • hlsl asm代码会被driver编程各个generation的gpu用的机器码
  • 最好的是在每个shaderload的时候画一下随便什么东西,否则第一次用的时候编译还是不太爽。

occlusion query:

  • 使用上一帧的occlusion query(with bigger bb)还是可以的。

MemoryPool:

     

     


     

    shaders in GPU

    • attribute的插值也是消耗性能的,这个有可能低于插值简单的attribute然后在pixel shader计算复杂结果。
    • 压缩的texture在L1 cache里面仍旧保持格式不变,在进入shader才会被解压
    • 对于g80架构,vertex texture比vertex buffer要快。

    shaders:

    • 想要定义一个不会被SetPixel/VertexShaderConstant覆盖的globa variable用static const float4这种,单纯const float4 v;这种会导致被放入constant table,开放给application来set。
    • Effect系统非常慢,相比较纯shader来说,尽量不要用了。

     

    dxt1 8:1的压缩

    dxt5 4:1的压缩

    在texture lock并memcpy的时候要注意这一点,对标准的size做一个缩放之后再处理

    但是在实际做的时候同样width&height的texture,不同的格式lock出来的pitch不一样,dxt5的是dxt1的2倍。

    所以可以统一的进行判断压缩格式,则算memory大小就用stride*height/4这种方法。

     


     

    software:

    1. 2011.1.14遇到一次dx control panel里的选项都灰了,不能设置成debug模式,重装就可以了
    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    在MATLAB中实现机械臂的仿真可以使用Robotic System Toolbox来进行。Robotic System Toolbox包含许多工具和函数,可以实现机械臂的建模、控制和仿真。 首先,需要定义机械臂的模型。可以使用robotics.RigidBodyTree类来创建机械臂的刚体树结构。通过添加关节和刚体可以构建机械臂的结构。可以使用函数robotics.RigidBody来创建刚体,并使用函数robotics.Joint来创建关节。 接下来,可以使用robotics.RigidBodyTree类中的函数来定义机械臂的初始状态。可以设置每个关节的初始位置和速度。 然后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的运动控制。可以使用函数robotics.InverseKinematics来实现逆运动学,根据目标位置和姿态来求解关节角度。可以使用函数robotics.CartesianTrajectory来生成机械臂的轨迹,指定起始和目标位置以及运动时间。 最后,可以使用robotics.RigidBodyTree类中的函数来进行机械臂的仿真。可以使用函数robotics.Rate来指定仿真的频率,然后使用循环来更新机械臂的状态和控制输入,实现机械臂的运动。 以下是一个基本的机械臂仿真的示例代码: ```matlab % 创建机械臂模型 robot = robotics.RigidBodyTree; % 添加机械臂的关节和刚体 % 设置机械臂的初始状态 % 运动控制 % 仿真循环 % 绘制机械臂的运动轨迹 ``` 在实际的机械臂仿真中,可能还需要考虑机械臂的动力学、碰撞检测和路径规划等问题。可以使用Robotic System Toolbox中的其他工具和函数来处理这些问题。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值