Я пытаюсь создать текстуру вручную из моих собственных данных и отобразить ее. Как я мог использовать в разных документах DirectX, основная часть кода была бы написана таким образом
// Global variables
HWND g_hWnd = NULL;
D3D10_DRIVER_TYPE g_driverType = D3D10_DRIVER_TYPE_NULL;
ID3D10Device *g_pd3dDevice = NULL;
IDXGISwapChain *g_pSwapChain = NULL;
ID3D10RenderTargetView *g_pRenderTargetView = NULL;
ID3D10ShaderResourceView *g_pShaderResource = NULL;
ID3DX10Sprite *g_pSprite = NULL;
ID3D10Texture2D *g_pTexture = NULL;
// Any additional code for creation the window object
// ............
// Initialize DirectX
HRESULT InitDirectX()
{
HRESULT hr = S_OK;
RECT rc;
GetClientRect(g_hWnd, &rc);
UINT width = rc.right - rc.left;
UINT height = rc.bottom - rc.top;
D3D10_DRIVER_TYPE driverTypes[] =
{
D3D10_DRIVER_TYPE_HARDWARE,
D3D10_DRIVER_TYPE_REFERENCE
};
UINT numDriverTypes = sizeof(driverTypes)/sizeof(driverTypes[0]);
// Initialization of the Swap Chain and the Device
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = 64;
sd.BufferDesc.Height = 64;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = g_hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
{
g_driverType = driverTypes[driverTypeIndex];
hr = D3D10CreateDeviceAndSwapChain(NULL, g_driverType, NULL, D3D10_CREATE_DEVICE_DEBUG, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice);
if (SUCCEEDED(hr))
break;
}
if (FAILED(hr))
return hr;
ID3D10Texture2D *pBackBuffer;
hr = g_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
if (FAILED(hr))
return hr;
hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView);
pBackBuffer->Release();
if (FAILED(hr))
return hr;
g_pd3dDevice->OMSetRenderTargets(1, &g_pRenderTargetView, NULL);
// Create the Viewport
D3D10_VIEWPORT vp;
vp.Width = 64;
vp.Height = 64;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0.0f;
vp.TopLeftY = 0.0f;
g_pd3dDevice->RSSetViewports(1, &vp);// Fill the structure of future texture
D3D10_TEXTURE2D_DESC desc;
desc.Width = 64;
desc.Height = 64;
desc.MipLevels = desc.ArraySize = 1;
desc.MiscFlags = 0;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D10_USAGE_DYNAMIC;
desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
hr = g_pd3dDevice->CreateTexture2D( &desc, NULL, &g_pTexture );
// Get the access to the texture data
D3D10_MAPPED_TEXTURE2D mappedTex;
g_pTexture->Map( D3D10CalcSubresource(0, 0, 1), D3D10_MAP_WRITE_DISCARD, 0, &mappedTex );
int cnt = 0;
UCHAR* pTexels = (UCHAR*)mappedTex.pData;
ZeroMemory(pTexels, sizeof(pTexels));
for( UINT row = 0; row < desc.Height; row++ )
{
UINT rowStart = row * mappedTex.RowPitch;
for( UINT col = 0; col < desc.Width; col++ )
{
UINT colStart = col * 4;
if (cnt == 0)
{
pTexels[rowStart + colStart + 0] = 255; // Red
pTexels[rowStart + colStart + 1] = 128; // Green
pTexels[rowStart + colStart + 2] = 64; // Blue
pTexels[rowStart + colStart + 3] = 255; // Alpha
}
else
{
pTexels[rowStart + colStart + 0] = 64;// Red
pTexels[rowStart + colStart + 1] = 128;// Green
pTexels[rowStart + colStart + 2] = 255;// Blue
pTexels[rowStart + colStart + 3] = 255;// Alpha
}
cnt++;
cnt %= 2;
}
}
g_pTexture->Unmap( D3D10CalcSubresource(0, 0, 1));
// Bind shader and texture
D3D10_SHADER_RESOURCE_VIEW_DESC srvDesc;
// Fill the shader attributes
srvDesc.Format = desc.Format;
srvDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = desc.MipLevels - 1;
hr = g_pd3dDevice->CreateShaderResourceView(g_pTexture, &srvDesc, &g_pShaderResource);
// Create sprite object
hr = D3DX10CreateSprite(g_pd3dDevice, 1, &g_pSprite);
if (FAILED(hr))
return hr;
return S_OK;
}
// Now render the texture
void RenderScene()
{
float ClearColor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
g_pd3dDevice->ClearRenderTargetView(g_pRenderTargetView, ClearColor);
D3DXMATRIX mWorld;
D3DXMATRIX mView;
D3DXMATRIX mProjection;
// Now render the generated texture thus it will be entirelly displayed in window
D3DXMatrixTranslation(&mWorld, 0.0f, 0.0f, 0.0f);
D3DXMatrixPerspectiveFovLH(&mProjection, 0.3258f, 1.0f, 0.0f, 0.01f);
g_pSprite->SetProjectionTransform(&mProjection);
D3DXVECTOR3 vEyePt(0.0f, 0.0f, -3.0f);
D3DXVECTOR3 vLookAtPt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&mView, &vEyePt, &vLookAtPt, &vUpVec);
g_pSprite->SetViewTransform(&mView);
HRESULT hr;
g_pSprite->Begin(D3DX10_SPRITE_SORT_TEXTURE);
// Render sprite based on shader created on the basis of generated texture
D3DX10_SPRITE SpriteToDraw; // Sprite array
SpriteToDraw.matWorld = mWorld;
SpriteToDraw.TexCoord.x = 0.0f;
SpriteToDraw.TexCoord.y = 0.0f;
SpriteToDraw.TexSize.x = 1.0f;
SpriteToDraw.TexSize.y = 1.0f;
SpriteToDraw.ColorModulate = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
SpriteToDraw.pTexture = g_pShaderResource;
SpriteToDraw.TextureIndex = 0;
hr = g_pSprite->DrawSpritesBuffered(&SpriteToDraw, 1);
if (FAILED(hr))
{
MessageBox(NULL, L"Sprite display error", L"Error", 0);
}
g_pSprite->Flush();
g_pSprite->End();
g_pSwapChain->Present(0, 0);
}
Внезапно конечный результат представляет изображение с неоднородными «осветленными» полосами.
ссылка на изображение http://savepic.org/7623429.jpg:
Я пытался изменить параметры точки обзора, что привело к изменению количества видимых полос и их оттенка, но я не могу понять причину появления различных синих / оранжевых оттенков (в коде их цвета одинаковы). Кроме того, если я создаю текстуру, которая равномерно заполнена одним цветом, то есть:
for( UINT row = 0; row < desc.Height; row++ )
{
UINT rowStart = row * mappedTex.RowPitch;
for( UINT col = 0; col < desc.Width; col++ )
{
UINT colStart = col * 4;
pTexels[rowStart + colStart + 0] = xxx; // Exact color has no reason
pTexels[rowStart + colStart + 1] = yyy;
pTexels[rowStart + colStart + 2] = zzz;
pTexels[rowStart + colStart + 3] = ttt;
}
}
нет эффекта неравномерного оттенка конечной отображаемой текстуры.
Задача ещё не решена.