DirectX mały problem

0

Na wstępie dzięki że zajrzeliście:)

Zacząłem się uczyć DirectX i utknąłem nie wiem co jest nie tak, problem polega na tym że po kompilacji program się uruchamia i śmiga bez problemu ale kiedy uruchamiam plik *.exe wyskakuje okienko z tym czy wysłać informacje do microsoftu czy nie, a i korzystam z visual c++ 2008.

załączam do tego kod okna:

#include <d3dx9.h>

HWND hwnd;
IDirect3D9* d3d9;
IDirect3DDevice9* d3dd9;

bool NoweOkno();
LRESULT CALLBACK Proc(HWND, UINT, WPARAM, LPARAM);

struct OurVertex
{
  float x, y, z;
  float rhw;
  D3DCOLOR color;
};

const DWORD OURVERT_FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;

IDirect3DVertexBuffer9* d3dvb;

ID3DXEffect* pEffect;

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  NoweOkno();

  d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

  D3DPRESENT_PARAMETERS d3dpp;
  ZeroMemory(&d3dpp, sizeof(d3dpp));
  d3dpp.Windowed = true;
  d3dpp.BackBufferWidth = GetSystemMetrics(0);
  d3dpp.BackBufferHeight = GetSystemMetrics(1);
  d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

  d3d9 -> CreateDevice(D3DADAPTER_DEFAULT,
					   D3DDEVTYPE_HAL,
					   hwnd,
					   D3DCREATE_HARDWARE_VERTEXPROCESSING,
					   &d3dpp,
					   &d3dd9);

  OurVertex vertex[] = { {200.0f, 500.0f, 0.0f, 1.0f, 0xffff0000},
						 {400.0f, 100.0f, 0.0f, 1.0f, 0xff00ff00},
						 {600.0f, 500.0f, 0.0f, 1.0f, 0xff0000ff} };

  d3dd9 -> CreateVertexBuffer(sizeof(vertex),
							  D3DUSAGE_DYNAMIC,
							  OURVERT_FVF,
							  D3DPOOL_DEFAULT,
							  &d3dvb,
							  0);

  void* data;

  d3dvb -> Lock(0, 3*sizeof(OurVertex), &data, D3DLOCK_DISCARD);
  memcpy(data, (void*)vertex, sizeof(vertex));
  d3dvb -> Unlock();

  ID3DXBuffer* pErrs;
  D3DXCreateEffectFromFile(d3dd9, L"Shader.fx", 0, 0, 0, 0, &pEffect, &pErrs);
  if (pErrs)
  {
  //  MessageBox(hwnd, (char*)pErrs->GetBufferPointer(), "zóo", 0); 
    pErrs->Release();
  }

  MSG msgs;
  for(;;)
  {
    if(PeekMessage(&msgs, 0, 0, 0, PM_REMOVE))
	{
	  if(msgs.message == WM_QUIT) break;

	    TranslateMessage(&msgs);
		DispatchMessage(&msgs);
	}
	else
	{
	  d3dd9 -> Clear(0, 0, D3DCLEAR_TARGET, 0xff000000, 1, 0);
	  d3dd9 -> BeginScene();

	    UINT passes;
		D3DXHANDLE tech;
		pEffect->FindNextValidTechnique(0, &tech);
		pEffect->SetTechnique(tech);
		pEffect->Begin(&passes,0);
		for (UINT pass = 0; pass < passes; pass++)
		{
		  pEffect->BeginPass(pass);

		  d3dd9 -> SetFVF(OURVERT_FVF);
		  d3dd9 -> SetStreamSource(0, d3dvb, 0, sizeof(OurVertex));
		  d3dd9 -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

		  pEffect->EndPass();
		}
	  pEffect->End();

	  d3dd9 -> EndScene();
	  d3dd9 -> Present(0, 0, 0, 0);
	}
  }
  pEffect->Release();
  d3dvb -> Release();
  d3dd9 -> Release();
  d3d9 -> Release();
}

bool NoweOkno()
{
  WNDCLASSEX wc;
  TCHAR Name[] = TEXT("by Zwodnik");
  HINSTANCE hInst = GetModuleHandle(0);

  ZeroMemory(&wc, sizeof(wc));
  wc.cbSize = sizeof(wc);
  wc.hInstance = hInst;
  wc.lpfnWndProc = Proc;
  wc.lpszClassName = Name;
  wc.hIcon = LoadIcon(0, IDI_APPLICATION);
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);

  if(!RegisterClassEx(&wc)) return 0;

  hwnd = CreateWindowEx(0,
						Name,
						Name,
						WS_OVERLAPPEDWINDOW | WS_VISIBLE,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						0,
						0,
						hInst,
						0);

  return 1;
}

LRESULT CALLBACK Proc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
  switch(msg)
  {
    case WM_DESTROY:
	  PostQuitMessage(0);
    return 0;
  }
  return DefWindowProc(hWnd, msg, wPar, lPar);
}

i kod shadera:

void vsmain(float4 pos : POSITION,
			float4 color : COLOR,
			out float4 oPos : POSITION,
			out float4 oColor : COLOR)
{
  oPos = pos;
  oColor = color;
}

float4 psmain(float4 color : COLOR) : COLOR
{
  return color;
}

technique std
{
  pass
  {
    VertexShader = compile vs_2_0 vsmain();
	PixelShader = compile ps_2_0 psmain();
  }
}

Bardzo proszę o pomoc i jeszcze raz dzieki ;]

0

Nie polegaj na tym, że każda funkcja ustawi Twoje wskaźniki na NULL w razie błędu. Sprawdzaj co funkcja zwraca, i tego się trzymaj. Nawet wyzerowanie wskaźnika przed podaniem go do funkcji nie daje prawa do stwierdzenia, że funkcja zakończyła poprawnie, gdy wskaźnik nie jest zerem:

ID3DXBuffer* pErrs = 0;
D3DXCreateEffectFromFile(..., &pErrs);

// źle, i to bardzo
if (pErrs)
{
   // sukces
}

Zawsze pisz zgodnie z dokumentacją:

if (SUCCEEDED(D3DXCreateEffectFromFile(...)))
{
   // sukces
}

Druga sprawa, to sprawdź gdzie jest program, a gdzie jest Shader.fx:

project\Shader.fx
project\release\program.exe

Uruchamiając program z IDE, jego katalog roboczy jest ustawiany na project, i wszystko gra.
Uruchamiając program w explorerze, katalog roboczy jest project\release, więc shadera nie widać.

0

Dzięki stary wszystko śmiga:) [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1