Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рендер в тектстуру 
V
    Опции темы
Graf_h
Дата 13.9.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Привет. Помогите решить проблему. Ситуация такая: создаю рендер таргет
Код

V_TEXTURE VenFramework::createEmptyTexture(int width,int height,DWORD usage_flag){
    V_TEXTURE tex=NULL;
    D3DXCreateTexture(device,
        width,
        height,
        1,
        usage_flag,
        d3dpp.BackBufferFormat,
        D3DPOOL_DEFAULT,&tex);

    if (tex!=NULL){
        if (texture_list->texture==NULL){
            texture_list->last=texture_list;
            texture_list->texture=tex;
            texture_list->width=width;
            texture_list->height=height;
        } else{
            V_TextureList* new_node =new V_TextureList();
            new_node->texture=tex;
            new_node->width=width;
            new_node->height=height;
            texture_list->last->next=new_node;
            texture_list->last=new_node;
        }
    }
    return tex;
}


Все отлично создается. Проблема в том что когда я создаю рендер таргет до создания буфера вершин, то буфер вершин не создается, но когда я сначала создам буфер вершин, а после этого рендер таргет, все прекрасно работает и я могу рендерить в текстуру. 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Bitter
Дата 14.9.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Интересная глюковина. А что выдает при создании буфера? Какую ошибку?
PM MAIL ICQ Skype   Вверх
Graf_h
Дата 14.9.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Bitter,  ошибки никакой не выдает просто после вызова функции CreateVertexBuffer буфер все равно равен NULL. Я так подозреваю что нужно при каждом device->reset  удалять все таргеты и создавать по новой, тогда й келбек фунуцию нужно делать чтобы отследить это событие. У меня это возникает при переходе от полноэкранного приложения в оконное и наоборот. 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Graf_h
Дата 14.9.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Bitter,  Cтранно, у меня какие то артефакты лезут. Сцена рисуется но изображение моргает ужасно.
Код

void renderFunc(float delta){
    render->render2D_setRenderTarget(tex2);
    render->render2D_beginScene();
        for (int i=0;i<curr_sprites;i++){
            sprite[i].sprite_render(render);
            float x=sprite[i].sprite_getPositionX();
            float y=sprite[i].sprite_getPositionY();
            x+=200*delta;
            y+=200*delta;
            if(x>900) x-=900;
            if(y>700) y-=700;
            sprite[i].sprite_setPositionX(x);
            sprite[i].sprite_setPositionY(y);
                    
        }
    
        font->font_RenderEx(10,20,0,"fps: %d\ndelta: %f\nsynhronize:%d\ncount sprites:%d\nkey Up- add sprites,\nDown - remove sprites\nAlt+Enter - switch fullscreen\nSpace- switch synhronize",render->render2D_getFps(),delta,(int)render->render2D_getRenderSynhronize(),curr_sprites);
    render->render2D_endScene();
        
    render->render2D_restoreTarget();
    render->render2D_beginScene();
    Testsprite->sprite_render(render);
    float sc=Testsprite->sprite_getScalingW();
    
    sc+=0.5*delta*dir;
    if (sc>1.5){
        dir=-1;
    }else
    if (sc<0.5){
        dir=1;
    }    

    float ang=Testsprite->sprite_getRotation();
    ang+=0.1*delta;
    Testsprite->sprite_setRotation(ang);
    Testsprite->sprite_setScalingW(sc);
    Testsprite->sprite_setScalingH(sc);
    
    render->render2D_endScene();
    

    


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Bitter
Дата 15.9.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Покажи инициализацию графики, функцию  render->render2D_setRenderTarget(tex2) и  sprite[i].sprite_render(render)
PM MAIL ICQ Skype   Вверх
Graf_h
Дата 15.9.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Bitter, 

Вот мнмцмализация графики:

Код

void V_Render2D::render_init(){
    if (ref_vf!=NULL){
        ref_vf->getDevice()->CreateVertexBuffer(4*sizeof(V_Render2D_Primitives::V_Vertex),
            D3DUSAGE_WRITEONLY,
            V_Render2D_Primitives::V_Vertex::FVF,
            D3DPOOL_DEFAULT,
            &buffer,
            0);

        ref_vf->setMatrixProjection(V_MATRIX_ORTHO);
        ref_vf->getDevice()->SetFVF(V_Render2D_Primitives::V_Vertex::FVF);
        ref_vf->getDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE );
        ref_vf->getDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
        ref_vf->getDevice()->SetRenderState(D3DRS_LIGHTING,false);
        ref_vf->getDevice()->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
        ref_vf->getDevice()->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT);
        ref_vf->getDevice()->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);

        ref_vf->getDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
        ref_vf->getDevice()->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
        ref_vf->getDevice()->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
        
        ref_vf->getDevice()->SetRenderState( D3DRS_ALPHATESTENABLE, true );
        ref_vf->getDevice()->SetRenderState( D3DRS_ALPHAREF,        0x01 );
        ref_vf->getDevice()->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );
        
        ref_vf->getDevice()->SetRenderState( D3DRS_ZENABLE, true );
        ref_vf->getDevice()->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS);
        
        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );

        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
        ref_vf->getDevice()->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
        

        ref_vf->getDevice()->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
        ref_vf->getDevice()->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
        //ref_vf->getDevice()->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);

        Random_Seed(0);
    }
}


void V_Render2D::render2D_beginScene(){
    IDirect3DDevice9* device=ref_vf->getDevice();
    device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xFF000000, 1.0f, 0);
    device->BeginScene();
}

void V_Render2D::render2D_endScene(){
    ref_vf->getDevice()->EndScene();
    ref_vf->getDevice()->Present(0,0,0,0);
}

void V_Render2D::render_restore(){
    if (buffer!=NULL){
        ref_vf->getDevice()->SetStreamSource(0,NULL,0,sizeof(V_Render2D_Primitives::V_Vertex));
        buffer->Release();
        buffer=NULL;
    }
}




вот рисование спрайта:

Код

void V_Render2D::render2D_renderQuad(V_Render2D_Primitives::V_QUAD& quad){
    if (buffer!=NULL){
        V_Render2D_Primitives::V_Vertex* vertices=NULL;
        buffer->Lock(0, 0, (void**)&vertices, 0);
        memcpy((void*)vertices,&quad.v,4*sizeof(V_Render2D_Primitives::V_Vertex));
        buffer->Unlock();
        ref_vf->getDevice()->SetTexture(0,quad.tex);
        ref_vf->getDevice()->SetStreamSource(0,buffer,0,sizeof(V_Render2D_Primitives::V_Vertex));
        ref_vf->getDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
    }

}



а меняю таргеты так device->setRenderTargte. Интересно, когда рендерим в текстуру, нужно вызывать ref_vf->getDevice()->Present(0,0,0,0);? Мне кажется что не нужно. 






Это сообщение отредактировал(а) Graf_h - 15.9.2009, 11:53


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Bitter
Дата 15.9.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Ну вроде инициализация отличная, прорисовка тоже понятна, а вот с рендером в текстуру мне не понятно. На всякий случай вот мой код, только он на Делфи, но думаю всё понятно. Present делать не надо, а вот моргать может либо из-за лишнего Present, либо из-за какой-то очистки чего-то )))

Код

// Где-то в инициализации
Scene.D3Device.GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,Game.pBackBuffer);

....

// Вывод в текстуру
const size = 1024;

var oldD, D, pTextureSurfaceLevel : IDirect3DSurface9;

begin

 Scene.D3Device.CreateDepthStencilSurface(size,size,D3DFMT_D24S8,D3DMULTISAMPLE_NONE,0,false,D,nil);
 Scene.Materials[Material_ID].Texture[0].GetSurfaceLevel(0, pTextureSurfaceLevel);
 Scene.D3Device.GetDepthStencilSurface(oldD);
 Scene.D3Device.SetRenderTarget(0,pTextureSurfaceLevel);
 Scene.D3Device.SetDepthStencilSurface(D);

 Scene.D3Device.Clear(0, nil, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,0, 1.0, 0);
 Draw;

 Scene.D3Device.SetRenderTarget(0,Game.pBackBuffer);
 Scene.D3Device.SetDepthStencilSurface(oldD);

PM MAIL ICQ Skype   Вверх
Graf_h
Дата 15.9.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Bitter,  спасибо. Еще вопрос. Если переходить их фулскрина в оконный и наоборот, рендер таргеты нужно удалять и создаваь поновой, создавать калл функции и на верху обновлять?По крайней мере это единственный вариант, который я вижу.

 Моргало как раз из-за лишнего ref_vf->getDevice()->Present(0,0,0,0)smile

Это сообщение отредактировал(а) Graf_h - 15.9.2009, 13:55


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Bitter
Дата 15.9.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



ээмм... текстура создается функцией D3DDevice.CreateTexture. При переходе из полноэкранного режима, нужно создавать устройство заново, значит и текстуру тоже. Так что, думаю да.
PM MAIL ICQ Skype   Вверх
Graf_h
Дата 15.9.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Bitter,  плохо:(. Большое спасибо за помощь.


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




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


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

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