0

シェーダーをもう少し深く掘り下げたいので、シェーダーをレンダリングするためにいくつかの DX9 コードをセットアップしようとしています。FX Composer で正常にコンパイルおよび表示される非常に基本的なシェーダーがありますが、プログラムでコードをレンダリングするように設定した後、何らかの理由でテクスチャが表示されず、メッシュが濃い灰色になります。DirectX がメッシュを処理する方法に関係している可能性があると考えていますが、よくわかりません。関連するコードのスニペットは次のとおりです。いつものように、事前に感謝します!

.fx ファイル

float4x4 world_m    : WORLD;
float4x4 view_m     : VIEW;
float4x4 projection_m   : PROJECTION;

Texture gWorldTexture;

sampler2D image = 
sampler_state
{
    Texture = <gWorldTexture>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    MipFilter = LINEAR;
    AddressU = CLAMP;
    AddressV = CLAMP;
};

struct VertexIn
{
 float4 pos     : POSITION;
 float2 texco    : TEXCOORD;
};

struct VertexOut
{
 float4 pos     : POSITION;
 float2 texco       : TEXCOORD;
};

struct pixelInput
{   
 float2 texco    : TEXCOORD0;
};

VertexOut  mainVS(VertexIn input)
{
 VertexOut output = (VertexOut)0;
 float4x4 worldview_m       = mul(world_m, view_m);
 float4x4 worldViewProj_m   = mul(worldview_m, projection_m);
 output.pos = mul( input.pos, worldViewProj_m );
 output.texco = input.texco;
 return output;
}

float4 mainPS(pixelInput input) : COLOR0
{
 return tex2D( image, input.texco );
}

technique technique0 
{
 pass p0 
 {
     VertexShader = compile vs_2_0 mainVS();
     PixelShader = compile ps_2_0 mainPS();
 }
}

宣言

LPD3DXMESH meshSphere;
IDirect3DTexture9 *texture;
LPD3DXEFFECT effect;
D3DXHANDLE gWorldTexture;
D3DXHANDLE technique;

gfx_init 関数

LPD3DXBUFFER errorlog;
D3DXCreateTextureFromFile(d3ddev, "earth.png", &texture);    

D3DXCreateEffectFromFile(d3ddev, "dxtshader.fx", 0, 0,     D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &effect, &errorlog);

D3DXCreateSphere(d3ddev, 5.0f, 25, 25, &meshSphere, NULL);

render_frame 関数

void render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView,
    &D3DXVECTOR3 (0.0f, 3.0f, 15.0f),
    &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),
    &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
    effect->SetMatrix("view_m", &matView);

    D3DXMATRIX matProjection;
    D3DXMatrixPerspectiveFovLH(&matProjection,
                               D3DXToRadian(45),
                               (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT,
                               1.0f,
                               100.0f);
    effect->SetMatrix("projection_m", &matProjection);

    static float index = 0.0f; index+=0.03f;
    D3DXMATRIX matRotateY;
    D3DXMatrixRotationY(&matRotateY, index);
    effect->SetMatrix("world_m", &matRotateY);

    effect->Begin(NULL, NULL);
        effect->BeginPass(0);

        effect->SetTexture("gWorldTexture", texture);
            meshSphere->DrawSubset(0);

        effect->EndPass();
    effect->End();

    d3ddev->EndScene(); 

    d3ddev->Present(NULL, NULL, NULL, NULL);

    return;
}
4

2 に答える 2

1

本当に textcoords はまったく提供されません。頂点データに関する情報を提供するための頂点宣言はありません (たとえば、テキスト座標を頂点シェーダーに持ってくる:))

于 2013-02-05T09:26:00.250 に答える
1

テクスチャ座標で球体を生成するコードは次のとおりです: http://pastebin.com/GZV8mbbC、この投稿から見つかりました: http://www.gamedev.net/topic/629242-d3dxcreatesphere-and-texture/

テクスチャ座標が問題である可能性が最も高いと思います。

于 2013-02-05T09:04:57.163 に答える