Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
158 / 146 / 14
Регистрация: 03.02.2012
Сообщений: 726
Записей в блоге: 1
1

Правильная инициализация MSAA сглаживания

08.02.2015, 12:49. Просмотров 3136. Ответов 6
Метки нет (Все метки)


Какие структуры и переменные необходимо проинициализировать и передать чтобы включилось сглаживание MSAA ?

По Френку Луна :

C++
1
2
3
// Check MSAA Quality Levels supported
    result = m_device->CheckMultisampleQualityLevels( DXGI_FORMAT_R8G8B8A8_UNORM, 
                      m4xMsaaQualityCount,&m4xMsaaQualityNumber);
Проверяем поддерживается ли конкретный режим сглаживание и если да, то

C++
1
2
    swapChainDesc.SampleDesc.Count = m4xMsaaQualityCount;
    swapChainDesc.SampleDesc.Quality = m4xMsaaQualityNumber;
и далее инициализируем SwapChain
C++
1
2
3
4
5
result = factory->CreateSwapChain(m_device,&swapChainDesc,&m_swapChain);
    if(FAILED(result))
    {
        return false;
    }
Чего-то у меня при этом программа работает , но ничего не рисуется - чёрный экран. Ошибок нет.

Я пробовал инициализировать разные значения которые поддерживает мой адаптер, но всегда чёрный экран в ответ. кроме режима когда сглаживание выключено :
C++
1
2
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
Что ещё нужно где-то указать или прописать ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2015, 12:49
Ответы с готовыми решениями:

Алгоритм сглаживания MSAA
В общем нужен сам алгоритм, а не простое его описание. Есть текстура (GL_TEXTURE_2D_MULTISAMPLE),...

Правильная инициализация ?
Здравствуйте уважаемые программисты! Мне необходимо описать два класса, один ArrayOfInt - якобы...

Правильная инициализация curl
Добрый день Коллеги! Очень интересует один важный вопрос. Собираюсь использовать curl в своём...

Правильная инициализация переменной типа char
Во время моего изучения C# по урокам автор допустил популярную ошибку он записал переменную типа...

6
Эксперт С++
1923 / 1756 / 258
Регистрация: 03.05.2011
Сообщений: 4,019
Записей в блоге: 11
08.02.2015, 15:02 2
https://code.msdn.microsoft.co... g-9f9806de
1
158 / 146 / 14
Регистрация: 03.02.2012
Сообщений: 726
Записей в блоге: 1
10.02.2015, 16:02  [ТС] 3
Спасибо, что-то не помогло. Вроде бы там всё так же как и у меня инициализируется (прошёл код построчно).

Если у вас есть ещё идеи, буду благодарен вам.

у меня так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
    D3D11_RASTERIZER_DESC rasterDesc;
    D3D_FEATURE_LEVEL featureLevelSuccess;
    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    mEnable4xMsaa = true;
    m4xMsaaQualityCount = 4;
 
 
// Initialize the swap chain description.
    ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
 
    // Set to a single back buffer.
    swapChainDesc.BufferCount = 1;
 
    // Set the width and height of the back buffer.
    swapChainDesc.BufferDesc.Width = screenWidth;
    swapChainDesc.BufferDesc.Height = screenHeight;
 
    // Set regular 32-bit surface for the back buffer.
    swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
 
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    // Set the usage of the back buffer.
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
 
    // Set the handle for the window to render to.
    swapChainDesc.OutputWindow = hwnd;
 
    // Set to full screen or windowed mode.
    if(fullscreen)
    {
        swapChainDesc.Windowed = false;
    }
    else
    {
        swapChainDesc.Windowed = true;
    }
    // Set the scan line ordering and scaling to unspecified.
    swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
 
    // Discard the back buffer contents after presenting.
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
 
    // Don't set the advanced flags.
    swapChainDesc.Flags = 0;
D3D_FEATURE_LEVEL featureLevels[4] =
{
D3D_FEATURE_LEVEL_11_0, // First check D3D 11 support
D3D_FEATURE_LEVEL_10_1, // Second check D3D 10.1 support
D3D_FEATURE_LEVEL_10_0, // Next, check D3D 10 support
D3D_FEATURE_LEVEL_9_3 // Finally, check D3D 9.3 support
};
// Try to Init D3DDivece for DX11 usage
    result = D3D11CreateDevice(m_adapter1,D3D_DRIVER_TYPE_UNKNOWN,NULL,0,featureLevels,1,D3D11_SDK_VERSION,&m_device,&featureLevelSuccess,&m_deviceContext);
    if(FAILED(result))
    {
        MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);
        return false;
    }
    if( featureLevelSuccess != D3D_FEATURE_LEVEL_11_0 )
    {
        MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0);
        return false;
    }
// Check MSAA Quality Levels supported
    result = m_device->CheckMultisampleQualityLevels( DXGI_FORMAT_R8G8B8A8_UNORM, m4xMsaaQualityCount, &m4xMsaaQualityNumber);
    if(FAILED(result))
    {
        return false;
    }
    //  assert(m4xMsaaQuality > 0 );
 
    m4xMsaaQualityChoosen = m4xMsaaQualityNumber-1; 
// Use 4X MSAA?
if( mEnable4xMsaa ) 
    { 
        swapChainDesc.SampleDesc.Count = m4xMsaaQualityCount; // m4xMsaaQuality is returned via CheckMultisampleQualityLevels(). 
        swapChainDesc.SampleDesc.Quality = m4xMsaaQualityChoosen; //m4xMsaaQuality-1; 
    } 
 
// No MSAA 
    else {
    // Turn multisampling off.
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    }
 
    result = factory->CreateSwapChain(m_device,&swapChainDesc,&m_swapChain);
    if(FAILED(result))
    {
        return false;
    }
 
    // Setup the raster description which will determine how and what polygons will be drawn.
    rasterDesc.AntialiasedLineEnable = false;
    rasterDesc.CullMode = D3D11_CULL_BACK;
    rasterDesc.DepthBias = 0;
    rasterDesc.DepthBiasClamp = 0.0f;
    rasterDesc.DepthClipEnable = true;
    rasterDesc.FillMode = D3D11_FILL_SOLID;
    rasterDesc.FrontCounterClockwise = false;
    rasterDesc.MultisampleEnable = mEnable4xMsaa; // false
    rasterDesc.ScissorEnable = false;
    rasterDesc.SlopeScaledDepthBias = 0.0f;
 
    // Create the rasterizer state from the description we just filled out.
    result = m_device->CreateRasterizerState(&rasterDesc, &m_rasterState);
    if(FAILED(result))
    {
        return false;
    }
Добавлено через 1 час 14 минут
Разобрался.

Оказывается при инициализации

C++
1
2
3
4
5
    result = m_device->CreateDepthStencilView(m_depthStencilBuffer, NULL, &m_depthStencilView);
    if(FAILED(result))
    {
        return false;
    }

2-й параметр почему-то должын быть NULL

а я туда запихивал :
C++
1
2
3
    depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
    depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
    depthStencilViewDesc.Texture2D.MipSlice = 0;
Пока не разбирался почему так, но у меня заработало сглаживание во всех режимах.

Добавлено через 16 часов 32 минуты
Созрели вопросы:
1) А что есть CSAA и FSAA с точки зрения программирования видеоадаптера в DirectX 11 ?
2) Кто-нибудь внесите ясность. Насколько я понял физически присутствует только MSAA или я ошибаюсь ?
0
Эксперт С++
1923 / 1756 / 258
Регистрация: 03.05.2011
Сообщений: 4,019
Записей в блоге: 11
10.02.2015, 18:43 4
Цитата Сообщение от Kabak Посмотреть сообщение
Созрели вопросы
отличные алгоритмы сглаживания от MSAA разрабатываются сторонними компаниями отдельно, такими как NVIDIA (к примеру FXAA, TXAA или супер навороченный MFAA). Проще всего найти документацию и посмотреть как они устроены.
0
158 / 146 / 14
Регистрация: 03.02.2012
Сообщений: 726
Записей в блоге: 1
10.02.2015, 19:56  [ТС] 5
Я пытался найти хоть что-нибудь в Google - что-то только общая информация.

Собственно, если я правильно понял, когда я инициализирую режим сглаживания в DirectX, то он инициализируется исходя из того железа - видео-адаптера который стоит в компьютере и соответственно включается для одного производителя свой режим, а для другого свой. например, для Nvidia FSAA, а для ATI СSAA.

1) Я правильно понял ?

2) Если нет, то как понять какой конкретно режим сглаживания инициализируется в системе ?
0
Эксперт С++
1923 / 1756 / 258
Регистрация: 03.05.2011
Сообщений: 4,019
Записей в блоге: 11
10.02.2015, 22:53 6
Цитата Сообщение от Kabak Посмотреть сообщение
когда я инициализирую режим сглаживания в DirectX, то он инициализируется исходя из того железа - видео-адаптера который стоит в компьютере
нет. Я же написал, что алгоритмы разрабатываются не только microsoft'ом, но и другими компаниями. То, что разрабатывает NVIDIA работает только на видеокартах NVIDIA, т.е. по средствам драйвера и directx здесь уже не причём.
AMD более открытая компания, которая стремится делать всё с пометкой open source, поэтому её разработки (от части почти все, ну кроме скажем TressFX или mantle) могут работать и на других видеокартах.
0
158 / 146 / 14
Регистрация: 03.02.2012
Сообщений: 726
Записей в блоге: 1
11.02.2015, 09:24  [ТС] 7
т.е. инициализируя сглаживание в Direct3D я не могу знать какой именно режим сглаживания инициируется ( CSAA, FSAA, MSAA ) , я правильно понял ?

Добавлено через 3 минуты
Я почему спрашиваю ? Потому что у Фрэнка Луны описан только режим MSAA.

Я хочу понять, почему в играх пишут про CSAA разных вариаций и как его инициализировать ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 09:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

AMD HD 7970 - графические артефакты в Far Cry 3 при включенном MSAA
Доброго времени суток. Вот такая проблема - когда играю в Far Cry 3 при включенном сглаживании MSAA...

Что такое инициализация сегментов или инициализация регистров?
Подскажите, что такое инициализация сегментов или инициализация регистров? Вот строчка программы из...

Операция сглаживания матрицы
помогите с задачкой) Операция сглаживания матрицы дает новую матрицу того же размера, каждый...

Задать тип сглаживания картинки
Добрый день. При растягивании изображения на канве, картинка теряет своё качество и появляется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.