SlimDX(DirectX10)-如何更改纹理中的纹理?

SlimDX(DirectX10)-如何更改纹理中的纹理?,directx,direct3d,slimdx,Directx,Direct3d,Slimdx,我尝试更改已加载纹理的纹理 我的假设是使用Texture2D::Map和UnMap函数,但当我更改给定DataRectangle的数据时,没有任何更改 我需要一个简单的例子,比如,创建一个128x128的纹理,每个边都有从黑到白的渐变 Thx PS:Direct3D 10 C++示例也有帮助,SlimDX只是一个包装器,几乎完成了相同的功能。 < P>这是我的D3D10二维纹理加载器< /P> bool D3D10Texture::Init( GFXHandler* pHandler, unsi

我尝试更改已加载纹理的纹理

我的假设是使用Texture2D::Map和UnMap函数,但当我更改给定DataRectangle的数据时,没有任何更改

我需要一个简单的例子,比如,创建一个128x128的纹理,每个边都有从黑到白的渐变

Thx


PS:Direct3D 10 C++示例也有帮助,SlimDX只是一个包装器,几乎完成了相同的功能。

< P>这是我的D3D10二维纹理加载器< /P>
bool D3D10Texture::Init( GFXHandler* pHandler, unsigned int usage, unsigned int width, unsigned int height, unsigned int textureType, bool bMipmapped, void* pTextureData )
{
    mMipmapped      = bMipmapped;

    //SetData( pHandler, 0 );

    D3D10Handler* pD3DHandler   = (D3D10Handler*)pHandler;
    ID3D10Device* pDevice       = pD3DHandler->GetDevice();

    DXGI_SAMPLE_DESC dxgiSampleDesc;
    dxgiSampleDesc.Count    = 1;
    dxgiSampleDesc.Quality  = 0;

    D3D10_USAGE d3d10Usage;
    if ( usage & RU_All_Dynamic )   d3d10Usage  = D3D10_USAGE_DYNAMIC;
    else                            d3d10Usage  = D3D10_USAGE_DEFAULT;

    //unsigned int cpuAccess    = D3D10_CPU_ACCESS_WRITE;
    //if ( (usage & RU_Buffer_WriteOnly) == 0 ) cpuAccess |= D3D10_CPU_ACCESS_READ;

    unsigned int cpuAccess = 0;
    if ( !pTextureData )
    {
        cpuAccess   = D3D10_CPU_ACCESS_WRITE;
        //if ( (usage & RU_Buffer_WriteOnly) == 0 ) cpuAccess |= D3D10_CPU_ACCESS_READ;
    }

    unsigned int bindFlags  = D3D10_BIND_SHADER_RESOURCE;
    if ( usage & RU_Texture_RenderTarget )  bindFlags |= D3D10_BIND_RENDER_TARGET;

    unsigned int miscFlags  = 0;
    if ( usage & RU_Texture_AutoGenMipmap ) miscFlags |= D3D10_RESOURCE_MISC_GENERATE_MIPS;

    D3D10_TEXTURE2D_DESC d3d10Texture2DDesc;
    d3d10Texture2DDesc.Width            = width;
    d3d10Texture2DDesc.Height           = height;
    d3d10Texture2DDesc.MipLevels        = GetNumMipMaps( width, height, bMipmapped );
    d3d10Texture2DDesc.ArraySize        = 1;
    d3d10Texture2DDesc.Format           = GetD3DFormat( (TextureTypes)textureType );
    d3d10Texture2DDesc.SampleDesc       = dxgiSampleDesc;
    d3d10Texture2DDesc.Usage            = d3d10Usage;
    d3d10Texture2DDesc.BindFlags        = D3D10_BIND_SHADER_RESOURCE;
    d3d10Texture2DDesc.CPUAccessFlags   = cpuAccess;
    d3d10Texture2DDesc.MiscFlags        = miscFlags;

    //D3D10_SUBRESOURCE_DATA d3d10SubResourceData;
    //d3d10SubResourceData.pSysMem          = pTextureData;
    //d3d10SubResourceData.SysMemPitch      = GetPitch( width, (TextureTypes)textureType );
    //d3d10SubResourceData.SysMemSlicePitch = 0;

    D3D10_SUBRESOURCE_DATA* pSubResourceData    = NULL;
    if ( pTextureData ) 
    {
        pSubResourceData    = new D3D10_SUBRESOURCE_DATA[d3d10Texture2DDesc.MipLevels];

        char* pTexPos       = (char*)pTextureData;
        unsigned int pitch  = GetPitch( width, (TextureTypes)textureType );

        unsigned int count  = 0;
        unsigned int max    = d3d10Texture2DDesc.MipLevels;
        while( count < max )
        {
            pSubResourceData[count].pSysMem             = pTexPos;
            pSubResourceData[count].SysMemPitch         = pitch;
            pSubResourceData[count].SysMemSlicePitch    = 0;

            pTexPos += pitch * height;
            pitch   >>= 1;
            count++;
        }
    }

    if ( FAILED( pDevice->CreateTexture2D( &d3d10Texture2DDesc, pSubResourceData, &mpTexture ) ) )
    {
        return false;
    }

    if ( pSubResourceData )
    {
        delete[] pSubResourceData;
        pSubResourceData    = NULL;
    }

    mWidth  = width;
    mHeight = height;
    mFormat = (TextureTypes)textureType;

    mpTexture->AddRef();
    mpTexture->Release();

    D3D10_SHADER_RESOURCE_VIEW_DESC d3d10ShaderResourceViewDesc;
    d3d10ShaderResourceViewDesc.Format                      = d3d10Texture2DDesc.Format;
    d3d10ShaderResourceViewDesc.ViewDimension               = D3D10_SRV_DIMENSION_TEXTURE2D;
    d3d10ShaderResourceViewDesc.Texture2D.MostDetailedMip   = 0;
    d3d10ShaderResourceViewDesc.Texture2D.MipLevels         = GetNumMipMaps( width, height, bMipmapped );

    if ( FAILED( pDevice->CreateShaderResourceView( mpTexture, &d3d10ShaderResourceViewDesc, &mpView ) ) )
    {
        return false;
    }

    ResourceRecorder::Instance()->AddResource( this );
    return true;
}
boold3d10texture::Init(GFXHandler*pHandler,unsigned int用法,unsigned int宽度,unsigned int高度,unsigned int textureType,bool bMipmapped,void*pTextureData)
{
mmipmap=bmipmap;
//SetData(pHandler,0);
D3D10Handler*pD3DHandler=(D3D10Handler*)pHandler;
ID3D10Device*PDDevice=pD3DHandler->GetDevice();
DXGI_SAMPLE_DESC dxgiSampleDesc;
dxgiSampleDesc.Count=1;
dxgiSampleDesc.Quality=0;
D3D10_用法D3D10用法;
if(用法&所有用法动态)D3D10用法=D3D10用法动态;
否则d3d10Usage=D3D10_USAGE_默认值;
//无符号int-cpuAccess=D3D10\u CPU\u访问\u写入;
//如果((使用率和写入缓冲区)==0)cpuAccess=D3D10\U CPU\U访问\U读取;
无符号整数cpuAccess=0;
如果(!pTextureData)
{
cpuAccess=D3D10\u CPU\u访问\u写入;
//如果((使用率和写入缓冲区)==0)cpuAccess=D3D10\U CPU\U访问\U读取;
}
unsigned int bindFlags=D3D10_BIND_SHADER_RESOURCE;
if(用法&RU_纹理_渲染目标)bindFlags |=D3D10_BIND_渲染_目标;
无符号整型标志=0;
if(用法&RU_纹理_AutoGenMipmap)miscsflags|=D3D10_资源_MISC_GENERATE_MIPS;
D3D10_纹理描述D3D10纹理描述;
D3D10texture2desc.Width=宽度;
D3D10texture2desc.Height=高度;
d3d10Texture2DDesc.MipLevels=GetNumMipMaps(宽度、高度、BMipMaps);
D3D10texture2desc.ArraySize=1;
D3D10texture2desc.Format=GetD3DFormat((textureType)textureType);
D3D10texture2desc.SampleDesc=dxgiSampleDesc;
D3D10texture2desc.Usage=d3d10Usage;
d3d10Texture2DDesc.BindFlags=D3D10\u BIND\u SHADER\u资源;
D3D10texture2desc.CPUAccessFlags=cpuAccess;
D3D10texture2desc.miscsflags=miscsflags;
//D3D10_子资源_数据D3D10子资源数据;
//d3d10SubResourceData.psysem=pTextureData;
//d3d10SubResourceData.SysMemPitch=GetPitch(宽度,(textureType)textureType);
//d3d10SubResourceData.SysMemSlicePitch=0;
D3D10_子资源_数据*pSubResourceData=NULL;
if(pTextureData)
{
pSubResourceData=新的D3D10_子资源_数据[d3d10Texture2DDesc.MipLevels];
char*pTexPos=(char*)pTextureData;
无符号int-pitch=GetPitch(宽度,(textureType)textureType);
无符号整数计数=0;
unsigned int max=d3d10texture2desc.MipLevels;
同时(计数<最大值)
{
pSubResourceData[count].psysem=pTexPos;
pSubResourceData[count].SysMemPitch=pitch;
pSubResourceData[count].SysMemSlicePitch=0;
pTexPos+=节距*高度;
螺距>>=1;
计数++;
}
}
if(失败(pDevice->CreateTexture2D(&d3d10Texture2desc、pSubResourceData和mpTexture)))
{
返回false;
}
if(pSubResourceData)
{
删除源数据;
pSubResourceData=NULL;
}
mWidth=宽度;
mHeight=高度;
mFormat=(textureType)textureType;
mpTexture->AddRef();
mpTexture->Release();
D3D10_着色器_资源_视图_描述D3D10ShaderResourceViewer;
D3D10ShaderResourceWidesc.Format=D3D10Texture2Desc.Format;
D3D10ShaderResourceViewer.ViewDimension=D3D10_SRV_DIMENSION_TEXTURE2D;
d3d10ShaderResourceViewDesc.Texture2D.MostDetailedMip=0;
D3D10ShaderResourceView.Texture2D.MipLevels=GetNumMipMaps(宽度、高度、bMipmapped);
如果(失败(pDevice->CreateShaderResourceView(mpTexture,&D3D10ShaderResourceViewer,&mpView)))
{
返回false;
}
ResourceRecorder::Instance()->AddResource(此);
返回true;
}
使用该功能,您只需将白色纹理传递到黑色纹理。例如,要编写一个256x256文本,每一条水平线比前一行亮一倍,下面的代码可以工作

int* pTexture = new int[256 * 256];
int count = 0;
while( count < 256 )
{
    int count2 = 0;
    while( count2 < 256 )
    {
        pTexture[(count * 256) + count2] = 0xff000000 | (count << 16) | (count << 8) | count;
        count2++;
    }
    count++;
}
int*pTexture=newint[256*256];
整数计数=0;
而(计数<256)
{
int count2=0;
而(计数2<256)
{

pTexture[(count*256)+count2]=0xff000000 |(count确保遵循“资源使用限制”部分中的规则:

公共无效新数据(字节[]新数据)
{
DataRectangle mappedTex=null;
//分配并锁定资源
mappedTex=pTexture.Map(0,D3D10.MapMode.WriteDiscard,D3D10.MapFlags.None);
//如果无法保存纹理
如果(!mappedTex.Data.CanWrite)
{
抛出新的ApplicationException(“无法写入纹理”);
}
//将新数据写入纹理
mappedTex.Data.WriteRange(newData);
//解锁资源
pTexture.Unmap(0);
if(采样器标志)
TENTLEX=新数据;
}
这会覆盖每个新帧上的缓冲区,如果您只想写入一个texel,则可能需要使用D3D10.MapMode.readwrite或其他方法


您还需要使用其他写入函数之一在特定点写入datarectangle

谢谢,这对我有帮助。谢谢,这些限制在第一时间很难理解,但我知道我的代码可能无法工作的一些原因。
    public void NewData(byte[] newData)
    {
        DataRectangle mappedTex = null;
        //assign and lock the resource
        mappedTex = pTexture.Map(0, D3D10.MapMode.WriteDiscard, D3D10.MapFlags.None);
        // if unable to hold texture
        if (!mappedTex.Data.CanWrite)
        {
            throw new ApplicationException("Cannot Write to the Texture");
        }
        // write new data to the texture
        mappedTex.Data.WriteRange<byte>(newData);
        // unlock the resource
        pTexture.Unmap(0);
        if (samplerflag)
            temptex = newData;
    }