Jump to content
  • Advertisement
Sign in to follow this  
pnt1614

DX11 Effect in DX11?

This topic is 2094 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

Share this post


Link to post
Share on other sites
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();

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Edited by steven166

Share this post


Link to post
Share on other sites

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.

Edited by Solid_Spy

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!