OBS-Direct11数据结构
+ -

gs_texture_2d成员函数

2024-06-19 3 0

2d纹理可创建的类型是多样的。有是2d的,也有的是2d-cube的。有的是需要绑定的是渲染目标视图,有的是渲染着色器资源视图。其它的一些配置参数多样。

    InitTexture(data);//根据纹理数据创建纹理
    InitResourceView();//创建着色器资源视图

    if (isRenderTarget) //需要需要创建渲染目标资源视图
        InitRenderTargets();

创建纹理


void gs_texture_2d::InitTexture(const uint8_t *const *data)
{
    HRESULT hr;
    memset(&td, 0, sizeof(td));

    td.Width = width;
    td.Height = height;
    td.MipLevels = genMipmaps ? 0 : levels;
    td.ArraySize = type == GS_TEXTURE_CUBE ? 6 : 1;
    td.Format = twoPlane ? ((format == GS_R16) ? DXGI_FORMAT_P010  : DXGI_FORMAT_NV12) : dxgiFormatResource;
    td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    td.SampleDesc.Count = 1;
    td.CPUAccessFlags = isDynamic ? D3D11_CPU_ACCESS_WRITE : 0;
    td.Usage = isDynamic ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;

    if (type == GS_TEXTURE_CUBE)
        td.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE;

    if (isRenderTarget || isGDICompatible)
        td.BindFlags |= D3D11_BIND_RENDER_TARGET;

    if (isGDICompatible)
        td.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE;

    if ((flags & GS_SHARED_KM_TEX) != 0)
        td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
    else if ((flags & GS_SHARED_TEX) != 0)
        td.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;

    if (data) {
        BackupTexture(data);
        InitSRD(srd);
    }

    hr = device->device->CreateTexture2D(&td, data ? srd.data() : NULL, texture.Assign());
    if (FAILED(hr))
        throw HRError("Failed to create 2D texture", hr);

    if (isGDICompatible) {
        hr = texture->QueryInterface(__uuidof(IDXGISurface1),(void **)gdiSurface.Assign());
        if (FAILED(hr))
            throw HRError("Failed to create GDI surface", hr);
    }

    if (isShared) {
        ComPtr<IDXGIResource> dxgi_res;
        texture->SetEvictionPriority(DXGI_RESOURCE_PRIORITY_MAXIMUM);
        hr = texture->QueryInterface(__uuidof(IDXGIResource),(void **)&dxgi_res);
        if (FAILED(hr)) {
            blog(LOG_WARNING,
                 "InitTexture: Failed to query "
                 "interface: %08lX",
                 hr);
        } else {
            GetSharedHandle(dxgi_res);

            if (flags & GS_SHARED_KM_TEX) {
                ComPtr<IDXGIKeyedMutex> km;
                hr = texture->QueryInterface(__uuidof(IDXGIKeyedMutex),(void **)&km);
                if (FAILED(hr)) {
                    throw HRError("Failed to query "
                              "IDXGIKeyedMutex",
                              hr);
                }

                km->AcquireSync(0, INFINITE);
                acquired = true;
            }
        }
    }
}

着色器资源视图

进行了相应的成员函数初始化后,最终调用的是InitResourceView来构造着色器资源视图。

void gs_texture_2d::InitResourceView()
{
    HRESULT hr;

    memset(&viewDesc, 0, sizeof(viewDesc));
    viewDesc.Format = dxgiFormatView;

    if (type == GS_TEXTURE_CUBE) {
        viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
        viewDesc.TextureCube.MipLevels = genMipmaps || !levels ? -1 : levels;
    } else {
        viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
        viewDesc.Texture2D.MipLevels = genMipmaps || !levels ? -1 : levels;
    }

    hr = device->device->CreateShaderResourceView(texture, &viewDesc,shaderRes.Assign());
    if (FAILED(hr))
        throw HRError("Failed to create SRV", hr);

    viewDescLinear = viewDesc;
    viewDescLinear.Format = dxgiFormatViewLinear;

    if (dxgiFormatView == dxgiFormatViewLinear) {
        shaderResLinear = shaderRes;
    } else {
        hr = device->device->CreateShaderResourceView(
            texture, &viewDescLinear, shaderResLinear.Assign());
        if (FAILED(hr))
            throw HRError("Failed to create linear SRV", hr);
    }
}

渲染目标视图

void gs_texture_2d::InitRenderTargets()
{
    HRESULT hr;
    if (type == GS_TEXTURE_2D) {
        D3D11_RENDER_TARGET_VIEW_DESC rtv;
        rtv.Format = dxgiFormatView;
        rtv.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
        rtv.Texture2D.MipSlice = 0;

        hr = device->device->CreateRenderTargetView(
            texture, &rtv, renderTarget[0].Assign());
        if (FAILED(hr))
            throw HRError("Failed to create RTV", hr);
        if (dxgiFormatView == dxgiFormatViewLinear) {
            renderTargetLinear[0] = renderTarget[0];
        } else {
            rtv.Format = dxgiFormatViewLinear;
            hr = device->device->CreateRenderTargetView(
                texture, &rtv, renderTargetLinear[0].Assign());
            if (FAILED(hr))
                throw HRError("Failed to create linear RTV",
                          hr);
        }
    } else {
        D3D11_RENDER_TARGET_VIEW_DESC rtv;
        rtv.Format = dxgiFormatView;
        rtv.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
        rtv.Texture2DArray.MipSlice = 0;
        rtv.Texture2DArray.ArraySize = 1;

        for (UINT i = 0; i < 6; i++) {
            rtv.Texture2DArray.FirstArraySlice = i;
            hr = device->device->CreateRenderTargetView(
                texture, &rtv, renderTarget[i].Assign());
            if (FAILED(hr))
                throw HRError("Failed to create cube RTV", hr);
            if (dxgiFormatView == dxgiFormatViewLinear) {
                renderTargetLinear[i] = renderTarget[i];
            } else {
                rtv.Format = dxgiFormatViewLinear;
                hr = device->device->CreateRenderTargetView(
                    texture, &rtv,
                    renderTargetLinear[i].Assign());
                if (FAILED(hr))
                    throw HRError(
                        "Failed to create linear cube RTV",
                        hr);
            }
        }
    }
}

0 篇笔记 写笔记

11.纹理
本文实现从文件加载纹理并将其映射到几何图形!源码下载地址:https://www.braynzarsoft.net/file/11DX11_Lesson_11_Textures_zip.zip介绍在这里,我们将学习如何将纹理映射到我们的对象。在 Direct3D 中,我们使用 2D (u,v......
2.2.2纹理资源
正如我们在最后几节中所看到的,有无数不同的缓冲区资源,以及为各种用途配置它们的许多不同方法。然而,缓冲区只是资源故事的一半。纹理为基于GPU作为渲染处理器的资源提供了不同的概念。“纹理”一词指的是一种在性质上与图像或类似图像的内存资源。这是一个非常松散的定义,因为有一系列不同的纹理类型,具有不同的维......
2D纹理
我们将探索的第二种纹理类型是2D纹理。由于这种纹理类型与标准2D图像布局密切相关,因此它通常是使用最广泛的纹理类型之一。此资源被组织为二维元素网格,其中每个元素都是DXGI_FORMAT枚举的成员。2D纹理的各种子资源形式如图2.31所示。如图2.31所示,这些纹理以与ID纹理类似的方式支持mip贴......
gs_texture纹理
gs_texture结构体是gs_texture_2d和gs_texture_3d的基类。struct gs_texture : gs_obj { gs_texture_type type; //纹理类型:2d,2d(cube),3d uint32_t levels; //纹理级......
gs_texture_2d
按照上节,gs_texture_2d有两种类型的纹理,分别为2D和2D-CUBE纹理类型。其从数据组织上来讲,一个是一拖一,一个是一拖6。struct gs_texture_2d : gs_texture { ComPtr texture; ......
D3D11的着色器资源视图和资源视图有什么区别
在Direct3D 11中,着色器资源视图(Shader Resource View,SRV)和渲染目标视图(Render Target View,RTV)是两个不同的概念。着色器资源视图(SRV):主要用途是将资源(如纹理、缓冲区等)绑定到着色器阶段(如像素着色器、顶点着色器等)。可以用来......
gs_texture_2d成员函数
2d纹理可创建的类型是多样的。有是2d的,也有的是2d-cube的。有的是需要绑定的是渲染目标视图,有的是渲染着色器资源视图。其它的一些配置参数多样。 InitTexture(data);//根据纹理数据创建纹理 InitResourceView();//创建着色器资源视图 ......
6.4.2 HLSL纹理缓冲区
由于常量缓冲区针对小尺寸和统一的访问模式进行了优化,因此在某些情况下,它们可能具有未知期望的性能特性。一种常见的情况是用于蒙皮的骨骼矩阵阵列。在这种情况下,每个顶点都包含一个或多个索引,指示阵列中的哪个骨骼应用于变换位置和法线。在许多硬件类型上,这种访问模式将导致执行着色器程序的线程序列化对骨骼数据......
利用d3d11将两个rgb数据格式的纹理图像合并到一个新的2D纹理
要利用D3D11将两个RGB数据格式的纹理图像合并到一个新的2D纹理中,你可以按照以下步骤进行操作:首先,创建两个源纹理和一个目标纹理。可以使用D3D11_TEXTURE2D_DESC结构来指定纹理的参数,例如宽度、高度、格式等。对于RGB数据格式,常见的格式包括DXGI_FORMAT_R8G8......
作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!