Передать текстуру в эффект D3D9 для объекта Mesh

Я пытаюсь настроить некоторый код DX9 для рендеринга шейдеров, поскольку я пытаюсь вникнуть в них немного глубже. У меня есть очень простой шейдер, который прекрасно компилируется и отображается в FX Composer, но после настройки моего кода для рендеринга в моей программе текстура по какой-то причине не отображается, сетка — просто темно-серый цвет. Я думаю, что это может иметь отношение к тому, как DirectX обрабатывает меши, но я не слишком уверен. Вот соответствующие фрагменты кода, и, как всегда, заранее спасибо!

.валютный файл

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;
}

0

Решение

Вот некоторый код для генерации сферы с текстурными координатами: http://pastebin.com/GZV8mbbC, найдено через этот пост: http://www.gamedev.net/topic/629242-d3dxcreatesphere-and-texture/

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

1

Другие решения

На самом деле текстовые корды вообще не предоставляются, нет никакого объявления вершины любого вида для подачи информации о данных вершины (например, что вы переносите текстовые координаты в вершинный шейдер :))

1

По вопросам рекламы [email protected]