Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Effect in DX11?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 steven166   Members   -  Reputation: 234

Like
0Likes
Like

Posted 26 January 2013 - 03:32 AM

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?



Sponsor:

#2 Vexal   Members   -  Reputation: 416

Like
1Likes
Like

Posted 26 January 2013 - 12:54 PM

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();


#3 Solid_Spy   Members   -  Reputation: 427

Like
0Likes
Like

Posted 26 January 2013 - 06:38 PM

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



#4 steven166   Members   -  Reputation: 234

Like
0Likes
Like

Posted 26 January 2013 - 10:55 PM

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, 26 January 2013 - 10:59 PM.


#5 Solid_Spy   Members   -  Reputation: 427

Like
0Likes
Like

Posted 27 January 2013 - 12:16 AM

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, 27 January 2013 - 12:16 AM.


#6 Vexal   Members   -  Reputation: 416

Like
0Likes
Like

Posted 27 January 2013 - 12:52 AM

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.



#7 steven166   Members   -  Reputation: 234

Like
0Likes
Like

Posted 27 January 2013 - 08:09 PM

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?






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS