Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> direcx рендер в текстуру. 
:(
    Опции темы
kukurudza
Дата 21.1.2013, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



Есть у меня тройка текстур. Две из них - 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));
        }
    };


Это сообщение отредактировал(а) kukurudza - 22.1.2013, 10:41
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.