direcx рендер в текстуру.

 
0
 
C++
ava
kukurudza | 21.01.2013, 15:47
Есть у меня тройка текстур. Две из них - D3DUSAGE_DYNAMIC, одна - D3DUSAGE_RENDERTARGET.
Суть в следующем. Попеременке, в первые две из них, я записываю некоторые данные (на диске валяется огромная текстура, несколько гигабайт, из нее дергаю нужный кусок и через Lock/Unlock пишу массивы инфрмации).
Далее я хочу срендерить в третью текстуру несколько мип-уровней из одной из первых. Перед этим делаю Clear определенным цветом.
Причем оговорка такая. На самом деле таких троек у меня несколько. Просто как некоторый объект. Всего 3. И для каждой из троек у меня свой цвет от Clear (синий красный зеленый. Для простоты, посмотреть что получается). И для этих объектов я провожу совершенно одинаковые операции, описанные выше. Так вот, вместо того, чтобы увидеть текстуры (D3DUSAGE_RENDERTARGET.) с мип-уровнями, я вижу на месте текстур разные цвета (красный синий зеленый). Причем они правильные, каждая текстура заливается своим цветом. И даже иногда (!!! почему иногда?) я вижу один или несколько мип-уровней у одной из текстур. Ошибок никаких не возникает. В чем проблема?

    class layerObject {
        static const size_t TEXTURE_AND_BACKBUFFER_NUM = 2;
        size_t                    mip;
        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;

            mip = _mip;
            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, mip, 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 < mip; ++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));
        }
    };
Kommentare (0)

Kommentare werden nicht hinzugefügt

Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden