Нажмите для просмотра прикрепленного файлапопробовал другим путем.
Есть у меня тройка текстур. Две из них - D3DUSAGE_DYNAMIC, одна - D3DUSAGE_RENDERTARGET.
Суть в следующем. Попеременке, в первые две из них, я записываю некоторые данные (на диске валяется огромная текстура, несколько гигабайт, из нее дергаю нужный кусок и через Lock/Unlock пишу массивы инфрмации).
Далее я хочу срендерить в третью текстуру несколько мип-уровней из одной из первых. Перед этим делаю Clear определенным цветом.
Причем оговорка такая. На самом деле таких троек у меня несколько. Просто как некоторый объект. Всего 3. И для каждой из троек у меня свой цвет от Clear (синий красный зеленый. Для простоты, посмотреть что получается). И для этих объектов я провожу совершенно одинаковые операции, описанные выше. Так вот, вместо того, чтобы увидеть текстуры (D3DUSAGE_RENDERTARGET.) с мип-уровнями, я вижу на месте текстур разные цвета (красный синий зеленый). Причем они правильные, каждая текстура заливается своим цветом. И даже иногда (!!! почему иногда?) я вижу один или несколько мип-уровней у одной из текстур. Ошибок никаких не возникает. В чем проблема?
Код
class layerObject {
static const size_t NUMBEROFMIPLEVELS = 3;
static const size_t TEXTURE_AND_BACKBUFFER_NUM = 2;
D3DFORMAT format;
D3DXMATRIX projectionMatrix;
D3DXMATRIX viewMatrix;
D3DXMATRIX worldMatrix;
D3DXMATRIX backBufferProjectionMatrix;
D3DXMATRIX backBufferViewMatrix;
D3DXMATRIX backBufferWorldMatrix;
LPDIRECT3DSURFACE9 backBufferSurface;
LPDIRECT3DSURFACE9 surface;
LPDIRECT3DVERTEXBUFFER9 vertexBuffer;
public:
int number;
float TranZ;
size_t runTextureInd;
vin::Vector2<size_t> textureSize;
LPDIRECT3DTEXTURE9 textureRT;
LPDIRECT3DTEXTURE9 textureDT[TEXTURE_AND_BACKBUFFER_NUM];
public:
layerObject() {
generateMipLevels = false;
void *pVertices = NULL;
VWIGRAPHICINTERNAL->GetD3DDevice()->CreateVertexBuffer(32*sizeof(Vertex),0, Vertex::FVF_Flags, D3DPOOL_DEFAULT, &vertexBuffer, NULL);
vertexBuffer->Lock(0, sizeof(g_cubeVertices), (void**)&pVertices, 0);
memcpy(pVertices, g_cubeVertices, sizeof(g_cubeVertices));
vertexBuffer->Unlock();
GenerateMatrix();
vwiAssert(VWI_OK == section.Create());
number = 16;
TranZ = 0.1f;
format = _format;
textureRT = textureDT[0] = textureDT[1] = NULL;
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->CreateTexture(textureSize.x, textureSize.y, 1, D3DUSAGE_DYNAMIC, format, D3DPOOL_DEFAULT, &textureDT[1], NULL));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->CreateTexture(textureSize.x, textureSize.y, 1, D3DUSAGE_DYNAMIC, format, D3DPOOL_DEFAULT, &textureDT[0], NULL));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->CreateTexture(textureSize.x, textureSize.y, NUMBEROFMIPLEVELS, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &textureRT, NULL));
}
void GenerateMatrix(void) {
D3DXMatrixLookAtLH(&viewMatrix, &D3DXVECTOR3(0.0f, 0.0f,-8.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
D3DXMatrixPerspectiveFovLH(&projectionMatrix, D3DX_PI / 4.0f, 1.0f, 0.1f, 100.0f);
D3DXMatrixTranslation(&worldMatrix,0.0f,0.0f,TranZ);
}
void GenerateMipSubLevels(const size_t _index) {
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->GetTransform(D3DTS_WORLD, &backBufferWorldMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->GetTransform(D3DTS_VIEW, &backBufferViewMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->GetTransform(D3DTS_PROJECTION, &backBufferProjectionMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->GetRenderTarget(0, &backBufferSurface));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_PROJECTION, &projectionMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_VIEW, &viewMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_WORLD, &worldMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTexture(0, textureD[runTextureInd]));
for (size_t i = 0; i < NUMBEROFMIPLEVELS; ++i) {
vwiCheck_D3DAPI(textureRT->GetSurfaceLevel(i, &surface));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetRenderTarget(0, surface));
if (0 == _index) {
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(1.0f,0.0f,0.0f,0.0f), 1.0f, 0));
} else if (1 == _index) {
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,1.0f,0.0f,0.0f), 1.0f, 0));
} else if (2 == _index) {
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,1.0f,0.0f), 1.0f, 0));
} else if (3 == _index) {
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.5f,0.5f,0.5f,0.0f), 1.0f, 0));
}
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetStreamSource(0, vertexBuffer, 0, sizeof(Vertex)));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetFVF(Vertex::FVF_Flags));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, number, 2));
}
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetRenderTarget(0, backBufferSurface));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_PROJECTION, &backBufferProjectionMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_VIEW, &backBufferViewMatrix));
vwiCheck_D3DAPI(VWIGRAPHICINTERNAL->GetD3DDevice()->SetTransform(D3DTS_WORLD, &backBufferWorldMatrix));
}
};
Далее картинки. Вот три текстурки. Самая большая (заливается синим цветом) и самая маленькая (заливается красным цветом) отображаются. Причем, как видно, иногда остается на фоне заливка, а иногда все мип-уровни нормально срендерились. А вот средняя текстурка (которая зеленая) вообще НИКОГДА не имеет мип-уровней. layerObject - как раз три объекта этого класса я имею. Внутри них по три текстурки. А на экране я виже textureRT. Причем! Если выводить на экран текстуры textureDT - то все идеально. Я вижу как раз то, что хочу (что скачал с диска).