восставший из праха
+ Показать
− Скрыть
Итак, я создаю вертекс буффер в классе
LPDIRECT3DVERTEXBUFFER9& textr::initG (LPDIRECT3DDEVICE9 d, VertexQuad* vq)
{
VOID *pp;
d->CreateVertexBuffer( sizeof(VertexQuad), 0, D3DFVF_VERTEXPOINT, D3DPOOL_MANAGED, &vb0, NULL );
vb0->Lock( 0, sizeof(VertexQuad), (void**)&pp, 0 )
memcpy(pp, vq, sizeof(VertexQuad) );
vb0->Unlock();
return vb0;
};
Я конечно не знаю, как оно там в дирексе устроено, но может быть такое, что указатель pp живет лишь до конца функции, а после выхода из нее он уже никуда не указывает?
PA3UJIb
> после выхода из нее он уже никуда не указывает
правильно. Но он и не должен жить дольше.
восставший из праха
Но он и не должен жить дольше
Да. Вот я и говорю, что не у курсе как там этот метод lock ведёт себя. Он данные в буфер копирует себе? Или пользуется так, по ссылке?
PA3UJIb
> lock ведёт себя.
Ага. "Для доступа к памяти буфера вершин мы получаем указатель на содержимое с помощью метода Lock. Получив указатель на область памяти, можно считывать и записывать информацию"
Итак, вопрос как то сам собой решился, и опыта ни фига не принёс. Что печально, но не суть.
Со временем возник другой вопрос, господа эксперты.
Ситуация: Есть текстура 512*512 в .dds с текстом, частично прозрачная. Есть квад на который она натягивается. И лесенка, которая отображается по краям текста. Вроде бы уже перепробовал все mip/min/magfilter. Лесенка остаётся. DX9 и nvidia.
Вопрос, а какого лешего надо сделать, чтобы лесенка исчезла, и текстура стала отображаться нормально?
восставший из праха
текст рисовать нужно с антиалиасингом.
gamedevfor
В D3D же встроен MSAA
monobogdan
Для фонтов это вряд ли подойдет.
восставший из праха
Текстуру сюда прикрепи, прикрепи скрин того что получилось и код, как ты это рисуешь.
gamedevfor
Почему? Это же FXAA на уровне поликов работает, MSAA разве не на уровне пикселей?
monobogdan
С фонтами там всё не просто

gamedevfor
Не помогает. Лесенка живёт несмотря на уровни фильтрации, антиалиасинг и мультисэмплирование.
Глянул соседнюю тему. Всё вроде правильно. Квад квадратный, RT квадратная - а текстура с текстом с лесенкой.
восставший из праха
>фильтрации, антиалиасинг и мультисэмплирование
Ты применяешь к самой текстуре, а не к тексту.
MrShoor
мм...обычным DrawPrimitive
+ Показать
− Скрыть
отрисовка
D3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
D3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false);
D3dDevice->SetStreamSource( 0, Mcnt.vb0, 0, sizeof(VertexPoint) );
if(Mcnt.tex0!=NULL) D3dDevice->SetTexture(0, Mcnt.tex0);
D3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
if(Mcnt.tex1!=NULL) D3dDevice->SetTexture(0, Mcnt.tex1);
D3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 6, 2 );
if(Mcnt.tex2!=NULL) D3dDevice->SetTexture(0, Mcnt.tex2);
D3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 12, 2 );
Инициализация геометрии.
r=30.0f;
textr::VertexQuad vp0=textr::initGeom(-r,2*r,2*r,2*r),vp1=textr::initGeom(-3*r,2*r,2*r,2*r),vp2=textr::initGeom(-5*r,2*r,2*r,2*r);
Mply.initG(D3dDevice,vp0);
Mcnt.initG(D3dDevice,vp0,vp1,vp2);
Заполнение буфера в классе текстуры
LPDIRECT3DVERTEXBUFFER9& textr::initG (LPDIRECT3DDEVICE9 d, VertexQuad vq,VertexQuad vq1, VertexQuad vq2)
{
VOID *pp0;
d->CreateVertexBuffer( 3*sizeof(VertexQuad), 0, D3DFVF_VERTEXPOINT, D3DPOOL_MANAGED, &vb0, NULL );
vb0->Lock( 0, sizeof(VertexQuad), (void**)&pp0, 0 ) ;
memcpy(pp0, &vq, sizeof(VertexQuad) );
vb0->Unlock();
vb0->Lock( sizeof(VertexQuad), sizeof(VertexQuad), (void**)&pp0, 0 ) ;
memcpy(pp0, &vq1, sizeof(VertexQuad) );
vb0->Unlock();
vb0->Lock( 2*sizeof(VertexQuad), sizeof(VertexQuad), (void**)&pp0, 0 ) ;
memcpy(pp0, &vq2, sizeof(VertexQuad) );
vb0->Unlock();
return vb0;
};
Загрузка текстуры в классе текстуры.
textr& textr::initT (LPDIRECT3DDEVICE9 d,LPCSTR f0,LPCSTR f1,LPCSTR f2)
{
D3DXCreateTextureFromFile(d, f0, &tex0);
D3DXCreateTextureFromFile(d, f1, &tex1);
D3DXCreateTextureFromFile(d, f2, &tex2);
return *this;
};
инициализация D3D
HRESULT InitD3D( HWND hWnd,bool fs_1 )
{
if( NULL == ( D3d = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL;
HRESULT h1, h2;
D3DDISPLAYMODE displayMode;
D3DPRESENT_PARAMETERS d3dpp;
D3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode);
ZeroMemory( & d3dpp, sizeof( d3dpp) );
d3dpp.BackBufferWidth =displayMode.Width;
d3dpp.BackBufferHeight =displayMode.Height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //формат пикселей
d3dpp.BackBufferCount = 1;
//d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
//d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = fs_1; // полноэкранный режим
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;//D3DFMT_D24S8; // формат буфера глубины
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
D3DCAPS9 d3dcaps_1;
char text1[99];
D3d->GetDeviceCaps( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL ,&d3dcaps_1);
if( FAILED( D3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
& d3dpp, &D3dDevice ) ) )
{
if( FAILED( D3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
& d3dpp, &D3dDevice ) ) )
return E_FAIL;
}
//D3dDevice->SetRenderState( D3DRS_POINTSCALEENABLE,true);
D3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
D3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
D3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
D3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
D3dDevice->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS , TRUE );
D3dDevice->SetRenderState( D3DRS_ANTIALIASEDLINEENABLE , TRUE );
return S_OK;
}
Если надо весь код, дайте только знать. И так страшно выглядит, а полный так и вообще.