Форум Академгородка, Новосибирск > direcx mipmap
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: direcx mipmap
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование
Flinn
возникла проблема при создании нескольких мипуровней для текстуры. как это делается правильно?
я делаю так:
Код
DWORD usage = D3DUSAGE_DYNAMIC;
D3DPOOL pool = D3DPOOL_DEFAULT;
D3DFORMAT format = D3DFMT_DXT1;
DWORD levels = 5;
GetD3DDevice()->CreateTexture(textureSize.x,textureSize.y,levels,usage,format,pool,&texture,NULL);
texture->GenerateMipSubLevels();

получается следующее:
текстура самого нижнего уровня (с лучшим качеством) отображается корректно. текстуры остальных уровней отображаются не правильно. вместо них разные полосы цветные, артефакты. при этом переход между уровнями плавный, вроде бы "правильный".
куда копнуть?
_EViruS_
Попробовать обновить драйвер.
Возможно дело в D3DFMT_DXT1.
По хорошему нужен еще 1 вызов, который устанавливает фильтр, используемый при генерации мипов. Интернета внешнего под рукой нет - точное название функции не скажу.
Еще вполне возможно не хватает в Usage AUTOGENMIPMAP
Если ничего из вышеозначенного не помогает, то попробуйте заполнить мипы вручную через StretchRect и поверхности GetSurfaceLevel
_EViruS_
На будущее. Всем форумчанам по вопросам DX9-11 можно писать мне в личку - отвечу smile.gif
Flinn
Нажмите для просмотра прикрепленного файлапопробовал другим путем.
Есть у меня тройка текстур. Две из них - 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 - то все идеально. Я вижу как раз то, что хочу (что скачал с диска).
_EViruS_
Ты входные текстуры создал с одним мипом. Ты пишешь, что тебе надо взять из этих текстур некоторые мипы и отрисовать. Откуда их взять, если у тебя в текстурах 1 мип-уровень?

Сделай для эти текстур Usage AUTOGENMIPMAP. После записи (Unlock) позови SetAutoGenFilterType(D3DTEXF_LINEAR); GenerateMipSubLevels(); Это далее гарантирует, что в этих текстурах будут посчитаны мипы на GPU - для этого видеокарта должна поддерживать аппаратные мипы (быть старше года этак 2005).

Если тебе таки нужны мипы на текстуре, которая у тебя RENDER_TARGET, то она должна сама их генерировать при AUTOGENMIPMAP. Если AUTOGENMIPMAP не помогает, для нее тоже можно попробовать SetAutoGenFilterType(D3DTEXF_LINEAR); GenerateMipSubLevels().

Проект есть в открытом доступе?
Flinn
нету. приект большой. выложить нереально. карты: gts 250 и gtx 560ti. SetAutoGenFilterType(D3DTEXF_LINEAR); GenerateMipSubLevels(); не помогает. мипы не генерируются. это видно по картинке. она "рябит" при движении. мне не важно какие текстуры. нужно лишь чтобы они фильтровались и при приближении я не видел характерной "ряби", когда текстура размером 1024х1024 отрисовывается на участке 200х200 пикселов.
_EViruS_
Цитата(Flinn @ 22.01.2013, 19:11) *
нету. приект большой. выложить нереально. карты: gts 250 и gtx 560ti. SetAutoGenFilterType(D3DTEXF_LINEAR); GenerateMipSubLevels(); не помогает. мипы не генерируются. это видно по картинке. она "рябит" при движении. мне не важно какие текстуры. нужно лишь чтобы они фильтровались и при приближении я не видел характерной "ряби", когда текстура размером 1024х1024 отрисовывается на участке 200х200 пикселов.

SetSamplerState(MIP, Linear) для этих текстур включен? Есть бинарник? (+библиотеки) Я могу его в PIX посмотреть - может чего найду.
Flinn
Цитата(_EViruS_ @ 22.01.2013, 18:54) *
Ты входные текстуры создал с одним мипом. Ты пишешь, что тебе надо взять из этих текстур некоторые мипы и отрисовать. Откуда их взять, если у тебя в текстурах 1 мип-уровень?

то есть, чтобы делать моим способом, нужно чтобы в исходной текстуре было мип-уровней не меньше чем в конечной?
Цитата(_EViruS_ @ 22.01.2013, 18:54) *
SetSamplerState(MIP, Linear) для этих текстур включен?

да.
Цитата(_EViruS_ @ 22.01.2013, 18:54) *
Есть бинарник? (+библиотеки)

Есть, но там тоже куча всего тянется.
_EViruS_
Цитата(Flinn @ 24.01.2013, 14:44) *
Цитата(_EViruS_ @ 22.01.2013, 18:54) *
Ты входные текстуры создал с одним мипом. Ты пишешь, что тебе надо взять из этих текстур некоторые мипы и отрисовать. Откуда их взять, если у тебя в текстурах 1 мип-уровень?

то есть, чтобы делать моим способом, нужно чтобы в исходной текстуре было мип-уровней не меньше чем в конечной?

Нет, но ты пишешь: "Далее я хочу срендерить в третью текстуру несколько мип-уровней из одной из первых." и при этом у тебя в коде 1 мип-уровень задан.
У тебя DX Debug Runtime включен? Ругани нет в Debug Output?

Если ты соберешь бинарник со всеми библиотеками в один архив, то я могу посмотреть его в PIX.

Попробуй для начала работать только с 1 текстурой и заполнять ее каким-нибудь мип-уровнем другой текстуры. Так проверь все мип-уровни исходной текстуры.
Flinn
Хм, да вот, че далеко ходить. Вот проект песочница. Там в каждую текстуру нужно залить 6 мип-уровней, которые имеют разный цвет. То же самое фактически и у меня в программе. Почему тут не работает?
_EViruS_
Цитата(Flinn @ 28.01.2013, 15:54) *
Хм, да вот, че далеко ходить. Вот проект песочница. Там в каждую текстуру нужно залить 6 мип-уровней, которые имеют разный цвет. То же самое фактически и у меня в программе. Почему тут не работает?

Завтра погляжу. Гугл говорит, что в архиве вирус, а вирустотал молчит
_EViruS_
Пример не работал - крашился. Исправил баг на заливку вершин и добавил простую заливку мипов. Такое должно быть?
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Flinn
Да. Сейчас поразбираюсь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.