Effect in DX11?

Started by
5 comments, last by pnt1614 11 years, 2 months ago

I follow instructions from http://asawicki.info/news_1371_effects_in_directx_11.html to create an effect by loading from a file, but there is a problem with pixel shader. It looks like it was not be loaded

errorsmv.jpg

As you can see in the image, the pipeline does not have the pixel shader. And the source code for creating the effect and rendering is:


        DWORD shaderFlags = 0;
#if defined( DEBUG ) || defined( _DEBUG )
    shaderFlags |= D3D10_SHADER_DEBUG;
	shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif

	ID3D10Blob *effectBlob = 0, *errorsBlob = 0;
	HRESULT hr = D3DX11CompileFromFile(
	  L"Test.fx", 0, 0, 0, "fx_5_0", shaderFlags, 0, 0, &effectBlob, &errorsBlob, 0);

	//assert(SUCCEEDED(hr) && effectBlob);
	if (errorsBlob) 
	{
		MessageBoxA(0, (char*)errorsBlob->GetBufferPointer(), 0, 0);
		errorsBlob->Release();
	}
			
	SIZE_T temp = effectBlob->GetBufferSize();

	// Create D3DX11 effect from compiled binary memory block
	ID3DX11Effect *g_Effect;
	hr = D3DX11CreateEffectFromMemory(
		effectBlob->GetBufferPointer(), effectBlob->GetBufferSize(), 0, pd3dDevice, &g_pEffect);

	//assert(SUCCEEDED(hr));
	effectBlob->Release();

	g_pTech = g_pEffect->GetTechniqueByName("Test");
	GetEffectParameters();


        UINT stride = sizeof(Vertex);
        UINT offset = 0;
	pd3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);
	pd3dImmediateContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);
	
	// Render objects here...
	D3DX11_TECHNIQUE_DESC techDesc;
	g_pTech->GetDesc(&techDesc);

	ID3DX11EffectPass *g_EffectPass; // No need to be Release()-d.
	g_EffectPass = g_pTech->GetPassByIndex(0);
	g_EffectPass->Apply(0, pd3dImmediateContext);
	pd3dImmediateContext->DrawIndexed(36, 0, 0);

Anybody helps me, please?

Advertisement

This isn't an answer to your question, but, most of the functions you are calling are deprecated now (everything in D3DX). I'm assuming you're using VS2012, so you should use the tutorials that come with the new SDK.

You can load a pixel shader with:

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476513(v=vs.85).aspx (CreatePixelShader)

And subsequently call http://msdn.microsoft.com/en-us/library/windows/desktop/ff476472(v=vs.85).aspx (PSSetShader)

You will call CreatePixelShader on the binary data from the pre-compiled pixel shader from VS2012 -- it should be a .cso file. To read in the data in the file, you can just do this:

std::ifstream myFile("../x64/Shaders/UIVertexShader.cso", std::ios::in | std::ios::binary | std::ios::ate); //replace with the name of your shader

size_t fileSize = myFile.tellg();
myFile.seekg(0, std::ios::beg);
char* shaderData = new char[fileSize];
myFile.read(shaderData, fileSize);
myFile.close();

I tried using the same tutorial, but couldn't compile the d3dx11Effects.h to get the D3DX11Effects.lib files. How did you do it?

View my game dev blog here!

Thank Vexal for the reply, I know most of the functions I am calling are deprecated, but I need to create an effect because I want to invoke the SetMatrixArray() function for updating the matrix array in shader as redering. Do you have any idea about updating the matrix array in shader without using an effect in Directx 11?. By the way, I have already solved a problem for creating an effect.

Solid_Spy, you need to add the path to "c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Effects11\Inc" to Include directories in VC++ Directories. For Effects11.lib (not D3DX11Effects.lib), I just compiled and copied into "c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Effects11\lib", then configured my projects for the library path.

Thank Vexal for the reply, I know most of the functions I am calling are deprecated, but I need to create an effect because I want to invoke the SetMatrixArray() function for updating the matrix array in shader as redering. Do you have any idea about updating the matrix array in shader without using an effect in Directx 11?. By the way, I have already solved a problem for creating an effect.

Solid_Spy, you need to add the path to "c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Effects11\Inc" to Include directories in VC++ Directories. For Effects11.lib (not D3DX11Effects.lib), I just compiled and copied into "c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Effects11\lib", then configured my projects for the library path.

Oh, ok. Thanks :3 I was wondering what that file was for.

View my game dev blog here!

Steven166, do you mean a buffer with a matrix? If so, you should look at creating a constant buffer and updating that.

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476896(v=vs.85).aspx

You can then call UpdateSubResource() on a constant buffer which will send the data to the GPU.

Vexal, it is not what I meant. Just imagine that in shader, I have a constant buffer which is an array of matrix gBoneTransform[96]. And in C++ source code, I want to update that matrix array. For example, people use SetMatrixArray(array, count) to update the matrix array in an effect. But I am not sure that is there any way to do same thing without using an effect?

This topic is closed to new replies.

Advertisement