Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
1

Не могу разобратся с эффектами

24.01.2018, 22:37. Показов 986. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!!! Пишу код для загрузки и отрисовки эффектов,и столкнулся с проблемой,после компиляции окно игры зависает и я не могу закрыть его.

Вот код инициализации:
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
HRESULT InitialEffect()
//==============================================================================================
{
    ID3DXBuffer* errorBuffer = NULL;
    //Создать effect
    if(FAILED(D3DXCreateEffectFromFile( p3Ddev, "Shaders\\EffectParam.fx",
        NULL,
        NULL,
        D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, //Используем компилятор для DirectX 9
        NULL,
        &pEffect, 
        &errorBuffer)))
        return E_FAIL;
 
    if( errorBuffer ) //Выводим ошибки, если они есть
{
    MessageBoxA(hwnd, (char*)errorBuffer->GetBufferPointer(), 0, 0);
    errorBuffer->Release();
    terminate();
}
 
    D3DXMATRIX Result; 
    D3DXMatrixIdentity(&Result);
 
    pEffect->SetMatrix(pEffect->GetParameterByName(0, "g_mWorld"), &Result);
 
    // Выбираем самую первую технику
    pEffect->SetTechnique( pEffect->GetTechnique(0) );
 
 
}
Вот код отрисовки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 if(effect)
 {
      //begin the effect
        UINT uiPasses = 0;
        pEffect->Begin(&uiPasses, 0);
        for (UINT uiPass = 0; uiPass < uiPasses; uiPass++)
        {
            //render an effect pass
            pEffect->BeginPass(uiPass);
 
            //render the rectangle
                for (DWORD Mi = 0; Mi < dwMeshNumber[mesh]; Mi++)
                 {
                  p3Ddev->SetMaterial(&pMeshMaterial[mesh][Mi]);
                  p3Ddev->SetTexture(0, pMeshTextura[mesh][Mi]);
                  pMesh[mesh]->DrawSubset(Mi);
                 }
            pEffect->EndPass();
        }
 
        pEffect->End();
 
 }
Если код отрисовки эффекта закомментировать то всё компелится нормально.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2018, 22:37
Ответы с готовыми решениями:

Не могу разобратся
3. Как изменяется напряжение стабилитрона UСТ когда ток стабилитрона становится ниже 20 мА? 4....

Не могу разобратся
Прога работающий аксес базами, не хочет работать в клиентским машине... Поняти не...

Не могу разобратся
Всем привет. Мне стало интересно, как можно реализовать проверку авторизации пользователя в админ...

разобратся не могу
Привет всем.Дали курсовую(не мне). Немогу разобратся. Создайте в базе данных под управлением...

9
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
24.01.2018, 22:53 2
происходит выход за пределы массива
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
24.01.2018, 22:56  [ТС] 3
Antikl, Не совсем понял что это значит.
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
25.01.2018, 20:42 4
Цитата Сообщение от oleg rus Посмотреть сообщение
C++
1
2
p3Ddev->SetMaterial(&pMeshMaterial[mesh][Mi]);
p3Ddev->SetTexture(0, pMeshTextura[mesh][Mi]);
Таким образом Вы передаёте материал и текстуру в "фиксированный конвейер", который Вы сами отключили строчкой
C++
1
pEffect->Begin(&uiPasses, 0);
В эффект текстура передается так же как матрицы, вектора и другие параметры, причем до начала эффекта т.е. перед строчкой
C++
1
pEffect->Begin(&uiPasses, 0);
Как Вы это сделаете не знаю.
Рекомендую начать с чего-нибудь полегче, например, - вывод объектов одним цветом, передачу в эффект одной текстуры и тд.
И самое главное, - абсолютно бессмысленно задавать вопросы по эффекту не выложив его код.
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
25.01.2018, 21:29  [ТС] 5
KolDub, Эффект взял из примеров DirectX думаю он рабочий
вот код эффекта:

glSlang
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
//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------
shared float4x4 g_mWorld;                     // World view matrix
shared float4x4 g_mView; // World * View * Projection matrix
shared float4x4 g_mProj; // World * View * Projection matrix
 
shared float4 g_vLight = float4( 0.0f, 0.0f, -10.0f, 1.0f );  // Light position in view space
shared float4 g_vLightColor = float4( 1.0f, 1.0f, 1.0f, 1.0f );
texture  g_txScene;
float4   Diffuse;
 
 
sampler2D g_samScene =
sampler_state
{
    Texture = <g_txScene>;
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
};
 
 
void VertScene( float4 vPos : POSITION,
                float3 vNormal : NORMAL,
                float2 vTex0 : TEXCOORD0,
                out float4 oDiffuse : COLOR0,
                out float4 oPos : POSITION,
                out float2 oTex0 : TEXCOORD0 )
{
    // Transform the position from object space to homogeneous projection space
    oPos = mul( vPos, g_mWorld );
    oPos = mul( oPos, g_mView );
    oPos = mul( oPos, g_mProj );
 
    // Compute view space position
    float4 wPos = mul( vPos, g_mWorld );
    wPos = mul( wPos, g_mView );
 
    // Compute view space normal
    float3 N =  mul( vNormal, (float3x3)g_mWorld );
    N = normalize( mul( N, (float3x3)g_mView ) );
 
    float3 InvL = g_vLight - wPos;
    float LengthSq = dot( InvL, InvL );
 
    InvL = normalize( InvL );
    oDiffuse = saturate( dot( N, InvL ) ) * Diffuse * g_vLightColor;// / LengthSq;
 
    // Just copy the texture coordinate through
    oTex0 = vTex0;
}
 
 
float4 PixScene( float4 Diffuse : COLOR0,
                 float2 Tex0 : TEXCOORD0 ) : COLOR0
{
    // Lookup mesh texture and modulate it with diffuse and light color
    return tex2D( g_samScene, Tex0 ) * Diffuse;
//    return float4( tex2D( g_samScene, Tex0 ).xyz, 1.0f ) * Diffuse;
}
 
 
//--------------------------------------------------------------------------------------
// Techniques
//--------------------------------------------------------------------------------------
technique RenderScene
{
    pass P0
    {
        VertexShader = compile vs_2_0 VertScene();
        PixelShader  = compile ps_2_0 PixScene();
    }
}
Переделал функция рендера вот так
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
if(effect)
 {
       
       
      //begin the effect
        for (DWORD Mi = 0; Mi < dwMeshNumber[mesh]; Mi++)
                 {
                 
                    pEffect->ApplyParameterBlock(m_hParam);
 
                    UINT uiPasses;
                    pEffect->Begin(&uiPasses, 0);
                    for (UINT uiPass = 0; uiPass < uiPasses; ++uiPass)
                    {
                    //  //render an effect pass
                        pEffect->BeginPass(uiPass);
 
                              p3Ddev->SetMaterial(&pMeshMaterial[mesh][Mi]);
                              p3Ddev->SetTexture(0, pMeshTextura[mesh][Mi]);
                              pMesh[mesh]->DrawSubset(Mi);
                              pEffect->EndPass();
                    }
 
                    pEffect->End();
                 }
 
 }
компилируется нормально без зависаний но объект не отображается на сцене.

Добавлено через 21 минуту
KolDub, А случайно нет примера эффекта для раскраски объекта например красным цветом?
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
01.02.2018, 15:33 6
Цитата Сообщение от oleg rus Посмотреть сообщение
shared float4x4 g_mWorld; // World view matrix
shared float4x4 g_mView; // World * View * Projection matrix
shared float4x4 g_mProj; // World * View * Projection matrix
shared float4 g_vLight = float4( 0.0f, 0.0f, -10.0f, 1.0f ); // Light position in view space
shared float4 g_vLightColor = float4( 1.0f, 1.0f, 1.0f, 1.0f );
texture g_txScene;
Здесь эффект ждет передачи от основного модуля 3-х матриц, 2-х векторов и одной
текстуры. Я заметил попытку передачи только одной матрицы g_mWorld.
Цитата Сообщение от oleg rus Посмотреть сообщение
А случайно нет примера эффекта для раскраски объекта например красным цветом?
Есть:
color.fx
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
float4x4 w;
float4x4 v;
float4x4 p;
float4 c;
 
struct VI
{
    float4 position : POSITION;
};
 
struct PI
{
    float4 position : POSITION;
};
 
// Код вершинного шейдера
PI VS(VI IN)
{
    PI OUT;
    OUT.position = mul(mul(mul(IN.position, w), v), p);
    return OUT;
}
 
// Код пиксельного шейдера
float4 PS(PI IN) : COLOR
{
    return c;
}
 
technique Main
{
    pass p0 
    {
        VertexShader = compile vs_2_0 VS();
        PixelShader = compile ps_2_0 PS();
    }
}
Здесь архив примера проекта/решения (C++ VS2012)
effmono.zip
1
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
01.02.2018, 19:57 7
На всякий случай отдельно exe + fx файлы.
exe.zip
1
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
01.02.2018, 22:14  [ТС] 8
KolDub, Спасибо буду разбираться.
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
17.02.2018, 13:52 9
Еще один пример эффекта с передачей текстуры.
effmirror.zip
В основном модуле(Form1.h) перед использованием эффекта в него передаются нужные параметры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
if (эффектыToolStripMenuItem->Checked)
{
    eff->SetMatrix( "w", &matWorld);
    eff->SetMatrix( "v", &matView);
    eff->SetMatrix( "p", &matProj);
    eff->SetVector( "cp", (D3DXVECTOR4*)cp);
    eff->SetTexture( "tx", tx);
    eff->Begin(NULL, 0);
    eff->BeginPass(0);
    mym->DrawSubset(0);            
    eff->EndPass();
    eff->End();
}
...
На всякий случай exe+fx+ipg
exe.zip
1
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
18.02.2018, 00:54  [ТС] 10
KolDub, Не запускается что-то у меня твой исполняемый файл.

Добавлено через 28 минут
KolDub, Спасибо что помогаешь и не за был за мою проблему.
0
18.02.2018, 00:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2018, 00:54
Помогаю со студенческими работами здесь

Не могу разобратся с формулой
Нужно определить является ли точка с координатами х,у точкой пересечения диагоналей...

не могу разобратся с загрузчиком
Нужно сделать загрузчик картинок на сайт, только есть одна проблемка у меня в основной форме...

Не могу разобратся с меню
меню у меня на DLE сайте следующее код в main.tpl следуюющий &lt;li&gt;&lt;a...

С QProgressDialog -ом не могу разобратся...
Здравствуйте. Кто небуд может мне маленкий пример показать того, как работать с QProgressDialog?...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru