コード例 #1
0
ファイル: DX10Render.cpp プロジェクト: stopiccot/googlecode
Effect *DX10Render::loadEffectFromFile(const wchar_t *file)
{
	DX10Effect *result = new DX10Effect();

	DWORD dwShaderFlags = 0;
	//dwShaderFlags |= D3D10_SHADER_ENABLE_STRICTNESS;
	dwShaderFlags |= D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY;
	#if defined( DEBUG ) || defined( _DEBUG )
		dwShaderFlags |= D3D10_SHADER_DEBUG;
	#endif

	D3D10_SHADER_MACRO D3D10_Macro[] = { {"D3D10", "1"}, {NULL, NULL} };

	ID3D10Blob *error = NULL;
	HRESULT hr = D3DX10CreateEffectFromFile(file, D3D10_Macro, NULL, "fx_4_0", dwShaderFlags, 0,
		device, NULL, NULL, &result->effect, &error, NULL);
	if (FAILED(hr))
	{
		//log() << "Failed to create effect \"" << file << "\"\n";
		if (error != NULL)
		{
			char *errorMessage = (char*)error->GetBufferPointer();
			//log() << errorMessage << "\n";
		}

		delete result;
		return NULL;
	}

	result->technique = result->effect->GetTechniqueByName("Render");
	if (result->technique == NULL)
	{
		delete result;
		return NULL;
	}

	result->device = device;
	
	D3D10_PASS_DESC passDesc; memset(&passDesc, 0, sizeof(passDesc));
	ID3D10EffectPass *pass = result->technique->GetPassByIndex(0);
	hr = pass->GetDesc(&passDesc);
	if (FAILED(hr))
	{
		delete result;
		return NULL;
	}

	// VertexType::XYZ
	{
		static D3D10_INPUT_ELEMENT_DESC layoutXYZ[] = 
		{
			{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		};

		int numElements = sizeof(layoutXYZ) / sizeof(D3D10_INPUT_ELEMENT_DESC);
		hr = device->CreateInputLayout(layoutXYZ, numElements,
			passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &result->layoutXYZ);
	}

	// VertexType::XYZUV
	{
		static D3D10_INPUT_ELEMENT_DESC layoutXYZUV[] = 
		{
			{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
			{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
		};

		int numElements = sizeof(layoutXYZUV) / sizeof(D3D10_INPUT_ELEMENT_DESC);
		hr = device->CreateInputLayout(layoutXYZUV, numElements,
			passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &result->layoutXYZUV);
	}

	return result;
}