Followers 0

# DX11 Effect in DX11?

## 6 posts in this topic

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

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


0

##### Share on other sites

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 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:

size_t fileSize = myFile.tellg();
myFile.seekg(0, std::ios::beg);
myFile.close();
1

##### 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?

0

##### 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
0

##### 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
0

##### Share on other sites

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

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

0

##### 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?

0

## Create an account

Register a new account

Followers 0

• ### Similar Content

• Hi Guys,
I am just wondering if it is possible to acquire the address of the backbuffer if an API (based on DX11) only exposes the 'device' and 'context' pointers?
Any advice would be greatly appreciated

• bool InitDirect3D::Init() { if (!D3DApp::Init()) { return false; } //Additional Initialization //Disable Alt+Enter Fullscreen Toggle shortkey IDXGIFactory* factory; CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&factory)); factory->MakeWindowAssociation(mhWindow, DXGI_MWA_NO_WINDOW_CHANGES); factory->Release(); return true; }
As stated on the title and displayed on the code above, regardless of it Alt+Enter still takes effect...
I recall something from the book during the swapChain creation, where in order to create it one has to use the same factory used to create the ID3D11Device, therefore I tested and indeed using that same factory indeed it work.
How is that one particular factory related to my window and how come the MakeWindowAssociation won't take effect with a newly created factory?
Also what's even the point of being able to create this Factories if they won't work,?(except from that one associated with the ID3D11Device)
• By ProfL
Can anyone recommend a wrapper for Direct3D 11 that is similarly simple to use as SFML? I don't need all the image formats etc. BUT I want a simple way to open a window, allocate a texture, buffer, shader.

• Q1:
Since there is no more fixed pipeline rendering in DX11, for every part of rendering in DX11, do I need to create a brand-new vertex shader and pixel shader... or at least I have to find one relevant online. If you work on skinned meshes and other effects originally worked in DX9 fixed pipeline, do I have to rework everything by now?

Q2:
For assimp, if it originally was designed for DX9, like it is coupled to a DX9 device for creating meshes and materials etc. Do I have to add in the DX11 device in the assimp, or can I just leave the assimp to remain in DX9 and after the meshes are loaded, I just convert the vertex buffers and index buffers into DX11 buffers?
Thanks
Jack

• This header is mentioned in the book I'm reading but there is no documentation on msdn... Is it like an... outdated and abandoned header?
If so, what's the current default/recomended library for handling errors with directX?

• 13
• 11
• 18
• 18
• 15