.FX файлы в основном не загружаются, а те, которые не работают должным образом - PullRequest
0 голосов
/ 24 января 2012

По сути, я создал класс модели файла .x с анимацией и всеми, и у каждого класса модели есть указатель для класса файла эффекта, поэтому я делаю кучу разных моделей и заставляю их использовать один эффект, например свечение, для Например, около DrawSubset() в функции рендеринга каждой модели составляют Begin() и End() для эффекта. Проблема в 90% моих файлов .fx (я пытался сделать в FX composer и Rendermonkey, я пытался загрузить образцы даже простые) они не загружаются, и это говорит о том, что эффект равен нулю, и если что-то удастся загрузить, это делает всю геометрию серой или обрезает ее части. Это в основном мой код (о, и указатель устройства d3d Правильно настроен, не волнуйтесь, проблема не в этом):

***FXfileEntity.h***

#pragma once

#include <d3d9.h>
#include <d3dx9.h>

class CFXFileEntity{
private:
    LPDIRECT3DDEVICE9 m_d3dDevice;

    LPD3DXBUFFER pBufferErrors;
    D3DXEFFECT_DESC pEffectDesc;

    DWORD dwShaderFlags;

    D3DXHANDLE ambient, attenuation, bbmax, bbmin, bbsize, bcenter, bssize, bsmin, bsmax, diffuse,
    elapsed, emissive, envNormal, height, joint, jointW, jointWI, jointWIT, jointWV,
    jointWVI, jointWVIT, jointWVP, jointWVPI, jointWVPIT, last, normal, opacity,
    position, proj, projI, projIT, random, refraction, renderCT, renderDST, renderTC,
    renderTD, specular, specularP, standarGlob, TextureMat, time, UnitsScale, view,
    viewI, viewIT, viewP, viewPI, viewPIT, world, worldI, worldIT, worldV, worldVI,
    worldVIT, worldVP, worldVPI, worldVPIT;

    D3DXVECTOR4 amb4, att4, diff, emis, join, nor2, opa4, posit, ref4, rtc, spec, specP4;
    D3DXVECTOR3 att3, bbMax, bbMin, bbSiz, bCen, nor1, opa3, ref3, specP3;
    D3DXVECTOR2 opa2, ref2, rtd, specP2;

    float bsSiz, bsMin, bsMax, elapTime, heigtMap1, lasTime, opa1, ran, ref1, specP1, tim, unit;

    LPDIRECT3DTEXTURE9 envNorm, heightMapT, nor3, opa5, ref5, rct, rdst, stdG;

    D3DXMATRIX jWor, jWI, jWIT, jWV, jWVI, jWVIT, jWVP, jWVPI, jWVPIT, pro, proI, proIT, texM,
    vie, vieI, vieIT, vieP, viePI, viePIT, wor, worI, worIT, worV, worVI, worVIT, worVP, worVPI,
    worVPIT;

public:
    LPD3DXEFFECT anEffect;
    UINT cPasses;

    CFXFileEntity(LPDIRECT3DDEVICE9 d3dDevice);
    ~CFXFileEntity();
    HRESULT Load(LPCTSTR path);
    void Set();
};

и для функциональных тел:

#include "FXfileEntity.h"
#include <iostream>

CFXFileEntity::CFXFileEntity(LPDIRECT3DDEVICE9 d3dDevice) : m_d3dDevice(d3dDevice)
{
    anEffect = NULL;
    pBufferErrors = NULL;
    dwShaderFlags = 0;
    cPasses = 0;
}

CFXFileEntity::~CFXFileEntity(void)
{
    anEffect = NULL;
    pBufferErrors = NULL;
    dwShaderFlags = 0;
    cPasses = 0;
}

HRESULT CFXFileEntity::Load(LPCTSTR path)
{
HRESULT hr;
hr=D3DXCreateEffectFromFile(m_d3dDevice,path,NULL,NULL,0,NULL,&anEffect,NULL);

if(!anEffect)
{
    MessageBox(NULL, "fail", "f", MB_OK);
}

if(FAILED(hr))
{
    MessageBox(NULL, "hr  failed", "hrf", MB_OK);
}

ambient = anEffect->GetParameterBySemantic( NULL, "Ambient" );
attenuation = anEffect->GetParameterBySemantic( NULL, "Attenuation" );
bbmax = anEffect->GetParameterBySemantic( NULL, "BoundingBoxMax" );
bbmin = anEffect->GetParameterBySemantic( NULL, "BoundingBoxMin" );
bbsize = anEffect->GetParameterBySemantic( NULL, "BoundingBoxSize" );
bcenter = anEffect->GetParameterBySemantic( NULL, "BoundingCenter" );
bssize = anEffect->GetParameterBySemantic( NULL, "BoundingSphereSize" );
bsmin = anEffect->GetParameterBySemantic( NULL, "BoundingSphereMin" );
bsmax = anEffect->GetParameterBySemantic( NULL, "BoundingSphereMax" );
diffuse = anEffect->GetParameterBySemantic( NULL, "Diffuse" );
elapsed = anEffect->GetParameterBySemantic( NULL, "ElapsedTime" );
emissive = anEffect->GetParameterBySemantic( NULL, "Emissive" );
envNormal = anEffect->GetParameterBySemantic( NULL, "EnviromentNormal" );
height = anEffect->GetParameterBySemantic( NULL, "Height" );
joint = anEffect->GetParameterBySemantic( NULL, "Joint" );
jointW = anEffect->GetParameterBySemantic( NULL, "JointWorld" );
jointWI = anEffect->GetParameterBySemantic( NULL, "JointWorldInverse" );
jointWIT = anEffect->GetParameterBySemantic( NULL, "JointWorldInverseTranspose" );
jointWV = anEffect->GetParameterBySemantic( NULL, "JointWorldView" );
jointWVI = anEffect->GetParameterBySemantic( NULL, "JointWorldViewInverse" );
jointWVIT = anEffect->GetParameterBySemantic( NULL, "JointWolrdViewInverseTranspose" );
jointWVP = anEffect->GetParameterBySemantic( NULL, "JointWorldViewProjection" );
jointWVPI = anEffect->GetParameterBySemantic( NULL, "JointWorldViewProjectionInverse" );
jointWVPIT = anEffect->GetParameterBySemantic( NULL, "JointWorldViewProjectionTranspose" );
last = anEffect->GetParameterBySemantic( NULL, "LastTime" );
normal = anEffect->GetParameterBySemantic( NULL, "Normal" );
opacity = anEffect->GetParameterBySemantic( NULL, "Opacity" );
position = anEffect->GetParameterBySemantic( NULL, "Position" );
proj = anEffect->GetParameterBySemantic( NULL, "Projection" );
projI = anEffect->GetParameterBySemantic( NULL, "ProjectionInverse" );
projIT = anEffect->GetParameterBySemantic( NULL, "ProjectionInverseTranspose" );
random = anEffect->GetParameterBySemantic( NULL, "Random" );
refraction = anEffect->GetParameterBySemantic( NULL, "Refraction" );
renderCT = anEffect->GetParameterBySemantic( NULL, "RenderColorTarget" );
renderDST = anEffect->GetParameterBySemantic( NULL, "RenderDepthStencilTarget" );
renderTC = anEffect->GetParameterBySemantic( NULL, "RenderTargetClipping" );
renderTD = anEffect->GetParameterBySemantic( NULL, "RenderTargetDimension" );
specular = anEffect->GetParameterBySemantic( NULL, "Specular" );
specularP = anEffect->GetParameterBySemantic( NULL, "SpecularPower" );
standarGlob = anEffect->GetParameterBySemantic( NULL, "StandardGlobal" );
TextureMat = anEffect->GetParameterBySemantic( NULL, "TextureMatrix" );
time = anEffect->GetParameterBySemantic( NULL, "Time" );
UnitsScale = anEffect->GetParameterBySemantic( NULL, "UnitsScale" );
view = anEffect->GetParameterBySemantic( NULL, "View" );
viewI = anEffect->GetParameterBySemantic( NULL, "ViewInverse" );
viewIT = anEffect->GetParameterBySemantic( NULL, "ViewInverseTranspose" );
viewP = anEffect->GetParameterBySemantic( NULL, "ViewProjection" );
viewPI = anEffect->GetParameterBySemantic( NULL, "ViewProjectionInverse" );
viewPIT = anEffect->GetParameterBySemantic( NULL, "ViewProjectionInverseTranspose" );
world = anEffect->GetParameterBySemantic( NULL, "World" );
worldI = anEffect->GetParameterBySemantic( NULL, "WorldInverse" );
worldIT = anEffect->GetParameterBySemantic( NULL, "WorldInverseTranspose" );
worldV = anEffect->GetParameterBySemantic( NULL, "WorldView" );
worldVI = anEffect->GetParameterBySemantic( NULL, "WorldViewInverse" );
worldVIT = anEffect->GetParameterBySemantic( NULL, "WorldViewInverseTranspose" );
worldVP = anEffect->GetParameterBySemantic( NULL, "WorldViewProjection" );
worldVPI = anEffect->GetParameterBySemantic( NULL, "WorldViewProjectionInverse" );
worldVPIT = anEffect->GetParameterBySemantic( NULL, "WorldViewProjectionInverseTranspose" );

D3DXHANDLE hTech;
anEffect->FindNextValidTechnique( NULL, &hTech );
anEffect->SetTechnique( hTech );

return hr;
}

void CFXFileEntity::Set()
{
m_d3dDevice->GetTransform( D3DTS_WORLD, &wor );
m_d3dDevice->GetTransform( D3DTS_PROJECTION, &pro );
m_d3dDevice->GetTransform( D3DTS_VIEW, &vie );
D3DXMatrixInverse( &proI, NULL, &pro );
D3DXMatrixTranspose( &proIT, &proI );
D3DXMatrixInverse( &vieI, NULL, &vie );
D3DXMatrixTranspose( &vieIT, &vieI );
vieP = vie * pro;
D3DXMatrixInverse( &viePI, NULL, &vieP );
D3DXMatrixTranspose( &viePIT, &viePI );
D3DXMatrixInverse( &worI, NULL, &wor );
D3DXMatrixTranspose( &worIT, &worI );
worV = wor * vie;
D3DXMatrixInverse( &worVI, NULL, &worV );
D3DXMatrixTranspose( &worVIT, &worVI );
worVP= wor * vie * pro;
D3DXMatrixInverse( &worVPI, NULL, &worVP );
D3DXMatrixTranspose( &worVPIT, &worVPI );
tim = (float)GetTickCount()/1000.0f;

anEffect->SetFloat( time, tim );
anEffect->SetMatrix( proj, &pro );
anEffect->SetMatrix( projI, &proI );
anEffect->SetMatrix( projIT, &proIT );
anEffect->SetMatrix( view, &vie );
anEffect->SetMatrix( viewI, &vieI );
anEffect->SetMatrix( viewIT, &vieIT );
anEffect->SetMatrix( viewP, &vieP );
anEffect->SetMatrix( viewPI, &viePI );
anEffect->SetMatrix( viewPIT, &viePIT );
anEffect->SetMatrix( world, &wor );
anEffect->SetMatrix( worldI, &worI );
anEffect->SetMatrix( worldIT, &worIT );
anEffect->SetMatrix( worldV, &worV );
anEffect->SetMatrix( worldVI, &worVI );
anEffect->SetMatrix( worldVIT, &worVIT );
anEffect->SetMatrix( worldVP, &worVP );
anEffect->SetMatrix( worldVPI, &worVPI );
anEffect->SetMatrix( worldVPIT, &worVPIT );
}

и в классе модели это выглядит здесь:

this->Effect->Set();

    this->Effect->cPasses = 0;

    if( SUCCEEDED( Effect->anEffect->Begin(&this->Effect->cPasses, 0) ) ){

        for (DWORD i = 0; i < this->Effect->cPasses; i++)
     {
      Effect->anEffect->BeginPass(i);

      pDrawMesh->DrawSubset(iMaterial);

      Effect->anEffect->EndPass();
     }
      Effect->anEffect->End();
     }

Я пробовал разные значения на cPpass, в зависимости от того, что я вижу в файле .fx, это не имеет большого значения. Без файлов .fx мои файлы .x прекрасно отображаются с текстурами и анимацией ... Я никогда не думал Файлы .fx были бы такими сложными, что это, похоже, самая запутанная часть DirectX!

1 Ответ

0 голосов
/ 25 января 2012

Хорошо, глядя на «EdgeFuzz.fx» *, пожалуйста, возможно, опубликуйте файл, чтобы все могли его увидеть Шейдер использует следующее для ввода вершин.

/* data from application vertex buffer */
  struct appdata {
     float3 Position    : POSITION;
     float4 UV      : TEXCOORD0;
     float4 Normal  : NORMAL;
     float4 Tangent : TANGENT0;
     float4 Binormal    : BINORMAL0;
};

Я не вижу в вашем коде буфера вершин, который соответствует вышеуказанной семантике? т.е. вам нужно будет создать буфер вершин, соответствующий информационной вершине (семантическая: POSITION), texturecoord: семантическая: TEXCOORD0, нормальная (для освещения, семантическая: NORMAL), (тангенциальная и бинормальная для рельефного отображения)

Буфер вершин затем должен быть заполнен геометрией вашей сетки в структуре, как указано выше (вам нужно будет создать структуру c ++, соответствующую приведенной выше структуре hlsl)

Или есть еще код, который вы, возможно, исключили из поста? Я надеюсь, что это будет полезно для вас, так как этот вершинный шейдер будет затем брать эту информацию о геометрии и делать свое дело, когда вы вызываете технику (Main) (определенную в шейдере EdgeFuzz.fx)

...