首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用direct3d9、direct3d10或direct3d11对保存的原始argb视频(图像和视频也能工作)执行alpha混合?

如何使用direct3d9、direct3d10或direct3d11对保存的原始argb视频(图像和视频也能工作)执行alpha混合?
EN

Game Development用户
提问于 2020-05-11 03:22:56
回答 1查看 43关注 0票数 0

我正在尝试使用direct3d11在视频中执行alpha混合。为了实现这一点,我编写了下面的代码片段。我试着一帧一帧地从2.argb中读取视频文件,并将其存储在rawData中。后来,我将那个rawData传递给了CreateTexture2D,但是在API执行之后,pTexture仍然是空的。因此,我尝试将NULL传递给CreateTexture2D,将rawData传递给UpdateSubresource,但是pTexture仍然是空的。

代码语言:javascript
运行
复制
HRESULT result;
    FILE * fp = NULL;
    int size = 1280 * 720 * 4 ;
    void * rawData = NULL;
    D3D11_TEXTURE2D_DESC desc;
    desc.Width = 1280;
    desc.Height = 720;
    desc.MipLevels = 0;
    desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DYNAMIC;
    desc.BindFlags = D3D11_BIND_SHADER_RESOURCE| D3D11_BIND_RENDER_TARGET;
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;


    D3D11_SHADER_RESOURCE_VIEW_DESC shader;
    shader.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    shader.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    shader.Texture2D.MipLevels = -1 ;
    shader.Texture2D.MostDetailedMip = 0;


    fp = fopen("../Engine/Data/out2.argb", "rb");
    rawData = malloc(size);

    D3D11_SUBRESOURCE_DATA data;
    data.SysMemPitch = 1280 * 4;
    data.SysMemSlicePitch = 1280 * 720 * 4;


    if (NULL == rawData)
        return -1;
    int row_pitch = (1280 * 4) * sizeof(unsigned char);
    if (fp)
    {
        /*while (!feof(fp))
        {*/
            fread(rawData, size,1, fp);
            //D3D11_SUBRESOURCE_DATA *sSubData = new D3D11_SUBRESOURCE_DATA[1];
            //for (int i = 0; i < 1; i++) {
            //  sSubData[i].pSysMem = rawData;
            //  sSubData[i].SysMemPitch = (UINT)(1280 * 4);
            //  sSubData[i].SysMemSlicePitch = /*(UINT)(1280 * 720 * 4)*/0;
            //}

            //data.pSysMem = rawData;
            // GOT FRAME
            device->CreateTexture2D(&desc, NULL, &pTexture);
            deviceContext->UpdateSubresource(pTexture, 0, NULL, rawData, row_pitch , 0);
            result = device->CreateShaderResourceView(pTexture, &shader, &m_texture);
            if (FAILED(result))
            {
                return false;
            }


    /*  }*/

        fclose(fp);
        fp = NULL;
        free(rawData);
        return true;
```
代码语言:javascript
运行
复制
EN

回答 1

Game Development用户

发布于 2020-05-11 06:14:16

https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_用法

资源绑定选项动态:输入到一个阶段:是的,3-资源只能用单个子资源创建。资源不能是纹理数组。资源不能是mipmap链。

动态资源不能是mipmap链,因此在不使用mipmap的情况下创建纹理:

代码语言:javascript
运行
复制
D3D11_TEXTURE2D_DESC desc;
desc.MipLevels = 1;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.MiscFlags = 0;

您还有两个以上的问题。

  1. 您并不是在填充D3D11_TEXTURE2D_DESC结构的所有成员;您还需要将desc.SampleDesc.Quality初始化为0。
  2. 对于动态纹理,需要设置desc.CPUAccessFlags。

因此,您的最终工作,D3D11_TEXTURE2D_DESC结构将如下所示:

代码语言:javascript
运行
复制
desc.Width = 1280;
desc.Height = 720;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/182469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档