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