【C++】从零开始,只使用FFmpeg,Win32 API,实现一个播放器(三) (2)

修改 InitScence 函数,添加创建常量缓冲区的代码:

void InitScence(ID3D11Device* device, ScenceParam& param, const DecoderParam& decoderParam) { // ... // 常量缓冲区 auto constant = dx::XMMatrixScaling(1, 1, 1); constant = dx::XMMatrixTranspose(constant); D3D11_BUFFER_DESC cbd = {}; cbd.Usage = D3D11_USAGE_DYNAMIC; cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; cbd.ByteWidth = sizeof(constant); cbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA csd = {}; csd.pSysMem = &constant; device->CreateBuffer(&cbd, &csd, &param.pConstantBuffer); // ... }

因为需要每一帧都更新 pConstantBuffer 的内容,所以 Usage 必须要是 D3D11_USAGE_DYNAMIC,CPUAccessFlags 必须是 D3D11_CPU_ACCESS_WRITE。初始的时候,先给一个 缩放(1, 1, 1) 矩阵,其实就相当于啥也没变,这里注意 XMMatrixTranspose 函数,他把矩阵的行和列置换了,为什么要干这个呢,因为GPU看待矩阵行列的形式反了过来,CPU他是一行一行的读,GPU是一列一列的读。所以传送到GPU前需要处理一下。不过,缩放矩阵就算你不置换,结果都是正常的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydysf.html