I am following an example book called: Introduction to 3D Game Programming with DirectX 11
It is all written in VS2010. I would like to try using VS2013… It is an example project for Windows Desktop Program
I have a program with the following in it (including some other files as part of common use):
color.fx
//***************************************************************************************
// color.fx by Frank Luna (C) 2011 All Rights Reserved.
//
// Transforms and colors geometry.
//***************************************************************************************
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
// Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
// Just pass vertex color into the pixel shader.
vout.Color = vin.Color;
return vout;
}
float4 PS(VertexOut pin) : SV_Target
{
return pin.Color;
}
technique11 ColorTech
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_5_0, PS() ) );
}
}
BoxDemo.cpp
//***************************************************************************************
// BoxDemo.cpp by Frank Luna (C) 2011 All Rights Reserved.
//
// Demonstrates rendering a colored box.
//
// Controls:
// Hold the left mouse button down and move the mouse to rotate.
// Hold the right mouse button down to zoom in and out.
//
//***************************************************************************************
#include "d3dApp.h"
#include "d3dx11Effect.h"
#include "MathHelper.h"
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT4 Color;
};
class BoxApp : public D3DApp
{
public:
BoxApp(HINSTANCE hInstance);
~BoxApp();
bool Init();
void OnResize();
void UpdateScene(float dt);
void DrawScene();
void OnMouseDown(WPARAM btnState, int x, int y);
void OnMouseUp(WPARAM btnState, int x, int y);
void OnMouseMove(WPARAM btnState, int x, int y);
private:
void BuildGeometryBuffers();
void BuildFX();
void BuildVertexLayout();
private:
ID3D11Buffer* mBoxVB;
ID3D11Buffer* mBoxIB;
ID3DX11Effect* mFX;
ID3DX11EffectTechnique* mTech;
ID3DX11EffectMatrixVariable* mfxWorldViewProj;
ID3D11InputLayout* mInputLayout;
XMFLOAT4X4 mWorld;
XMFLOAT4X4 mView;
XMFLOAT4X4 mProj;
float mTheta;
float mPhi;
float mRadius;
POINT mLastMousePos;
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
PSTR cmdLine, int showCmd)
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
BoxApp theApp(hInstance);
if( !theApp.Init() )
return 0;
return theApp.Run();
}
BoxApp::BoxApp(HINSTANCE hInstance)
: D3DApp(hInstance), mBoxVB(0), mBoxIB(0), mFX(0), mTech(0),
mfxWorldViewProj(0), mInputLayout(0),
mTheta(1.5f*MathHelper::Pi), mPhi(0.25f*MathHelper::Pi), mRadius(5.0f)
{
mMainWndCaption = L"Box Demo";
mLastMousePos.x = 0;
mLastMousePos.y = 0;
XMMATRIX I = XMMatrixIdentity();
XMStoreFloat4x4(&mWorld, I);
XMStoreFloat4x4(&mView, I);
XMStoreFloat4x4(&mProj, I);
}
BoxApp::~BoxApp()
{
ReleaseCOM(mBoxVB);
ReleaseCOM(mBoxIB);
ReleaseCOM(mFX);
ReleaseCOM(mInputLayout);
}
bool BoxApp::Init()
{
if(!D3DApp::Init())
return false;
BuildGeometryBuffers();
BuildFX();
BuildVertexLayout();
return true;
}
void BoxApp::OnResize()
{
D3DApp::OnResize();
// The window resized, so update the aspect ratio and recompute the projection matrix.
XMMATRIX P = XMMatrixPerspectiveFovLH(0.25f*MathHelper::Pi, AspectRatio(), 1.0f, 1000.0f);
XMStoreFloat4x4(&mProj, P);
}
void BoxApp::UpdateScene(float dt)
{
// Convert Spherical to Cartesian coordinates.
float x = mRadius*sinf(mPhi)*cosf(mTheta);
float z = mRadius*sinf(mPhi)*sinf(mTheta);
float y = mRadius*cosf(mPhi);
// Build the view matrix.
XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
XMStoreFloat4x4(&mView, V);
}
void BoxApp::DrawScene()
{
md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::LightSteelBlue));
md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);
md3dImmediateContext->IASetInputLayout(mInputLayout);
md3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
UINT stride = sizeof(Vertex);
UINT offset = 0;
md3dImmediateContext->IASetVertexBuffers(0, 1, &mBoxVB, &stride, &offset);
md3dImmediateContext->IASetIndexBuffer(mBoxIB, DXGI_FORMAT_R32_UINT, 0);
// Set constants
XMMATRIX world = XMLoadFloat4x4(&mWorld);
XMMATRIX view = XMLoadFloat4x4(&mView);
XMMATRIX proj = XMLoadFloat4x4(&mProj);
XMMATRIX worldViewProj = world*view*proj;
mfxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&worldViewProj));
D3DX11_TECHNIQUE_DESC techDesc;
mTech->GetDesc( &techDesc );
for(UINT p = 0; p < techDesc.Passes; ++p)
{
mTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
// 36 indices for the box.
md3dImmediateContext->DrawIndexed(36, 0, 0);
}
HR(mSwapChain->Present(0, 0));
}
void BoxApp::OnMouseDown(WPARAM btnState, int x, int y)
{
mLastMousePos.x = x;
mLastMousePos.y = y;
SetCapture(mhMainWnd);
}
void BoxApp::OnMouseUp(WPARAM btnState, int x, int y)
{
ReleaseCapture();
}
void BoxApp::OnMouseMove(WPARAM btnState, int x, int y)
{
if( (btnState & MK_LBUTTON) != 0 )
{
// Make each pixel correspond to a quarter of a degree.
float dx = XMConvertToRadians(0.25f*static_cast<float>(x - mLastMousePos.x));
float dy = XMConvertToRadians(0.25f*static_cast<float>(y - mLastMousePos.y));
// Update angles based on input to orbit camera around box.
mTheta += dx;
mPhi += dy;
// Restrict the angle mPhi.
mPhi = MathHelper::Clamp(mPhi, 0.1f, MathHelper::Pi-0.1f);
}
else if( (btnState & MK_RBUTTON) != 0 )
{
// Make each pixel correspond to 0.005 unit in the scene.
float dx = 0.005f*static_cast<float>(x - mLastMousePos.x);
float dy = 0.005f*static_cast<float>(y - mLastMousePos.y);
// Update the camera radius based on input.
mRadius += dx - dy;
// Restrict the radius.
mRadius = MathHelper::Clamp(mRadius, 3.0f, 15.0f);
}
mLastMousePos.x = x;
mLastMousePos.y = y;
}
void BoxApp::BuildGeometryBuffers()
{
// Create vertex buffer
Vertex vertices[] =
{
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), (const float*)&Colors::White },
{ XMFLOAT3(-1.0f, +1.0f, -1.0f), (const float*)&Colors::Black },
{ XMFLOAT3(+1.0f, +1.0f, -1.0f), (const float*)&Colors::Red },
{ XMFLOAT3(+1.0f, -1.0f, -1.0f), (const float*)&Colors::Green },
{ XMFLOAT3(-1.0f, -1.0f, +1.0f), (const float*)&Colors::Blue },
{ XMFLOAT3(-1.0f, +1.0f, +1.0f), (const float*)&Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, +1.0f), (const float*)&Colors::Cyan },
{ XMFLOAT3(+1.0f, -1.0f, +1.0f), (const float*)&Colors::Magenta }
};
D3D11_BUFFER_DESC vbd;
vbd.Usage = D3D11_USAGE_IMMUTABLE;
vbd.ByteWidth = sizeof(Vertex) * 8;
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = vertices;
HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB));
// Create the index buffer
UINT indices[] = {
// front face
0, 1, 2,
0, 2, 3,
// back face
4, 6, 5,
4, 7, 6,
// left face
4, 5, 1,
4, 1, 0,
// right face
3, 2, 6,
3, 6, 7,
// top face
1, 5, 6,
1, 6, 2,
// bottom face
4, 0, 3,
4, 3, 7
};
D3D11_BUFFER_DESC ibd;
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT) * 36;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mBoxIB));
}
void BoxApp::BuildFX()
{
DWORD shaderFlags = 0;
#if defined( DEBUG ) || defined( _DEBUG )
shaderFlags |= D3D10_SHADER_DEBUG;
shaderFlags |= D3D10_SHADER_SKIP_OPTIMIZATION;
#endif
ID3D10Blob* compiledShader = 0;
ID3D10Blob* compilationMsgs = 0;
HRESULT hr = D3DX11CompileFromFile(L"FX/color.fx", 0, 0, 0, "fx_5_0", shaderFlags,
0, 0, &compiledShader, &compilationMsgs, 0);
// compilationMsgs can store errors or warnings.
if( compilationMsgs != 0 )
{
MessageBoxA(0, (char*)compilationMsgs->GetBufferPointer(), 0, 0);
ReleaseCOM(compilationMsgs);
}
// Even if there are no compilationMsgs, check to make sure there were no other errors.
if(FAILED(hr))
{
DXTrace(__FILE__, (DWORD)__LINE__, hr, L"D3DX11CompileFromFile", true);
}
HR(D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(),
0, md3dDevice, &mFX));
// Done with compiled shader.
ReleaseCOM(compiledShader);
mTech = mFX->GetTechniqueByName("ColorTech");
mfxWorldViewProj = mFX->GetVariableByName("gWorldViewProj")->AsMatrix();
}
void BoxApp::BuildVertexLayout()
{
// Create the vertex input layout.
D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
// Create the input layout
D3DX11_PASS_DESC passDesc;
mTech->GetPassByIndex(0)->GetDesc(&passDesc);
HR(md3dDevice->CreateInputLayout(vertexDesc, 2, passDesc.pIAInputSignature,
passDesc.IAInputSignatureSize, &mInputLayout));
}
When I goto compile it it throws the error:
FXC : error X3501: 'main': entrypoint not found
What is the entry point of my shader file from the examples? and how do I set that in the shader compiler properties? do I also have to set it to shader 5 considering it is mentioning vs_5_0 in the shader file?
I have tried a variation of the following article: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/51859322-fc36-4946-b4cb-b5971fcaa9e5/fxc-error-x3501-main-entrypoint-not-found?forum=wingameswithdirectx but just can’t get it to run.
simple sample fx file as bellow, but when i add it to project in vs11, it report the error:1>FXC : error X3501: ‘main’: entrypoint not found,
how can i config the property of the project? thanks
//—————————————————————————————
// defines
//—————————————————————————————
#define MAX_BONE_MATRICES 255
//—————————————————————————————
// Input/Output structures
//—————————————————————————————
struct VSSkinnedIn
{
float3 Pos : POSITION;
//Position
float4 Weights : WEIGHTS;
//Bone weights
uint4 Bones : BONES;
//Bone indices
float3 Norm : NORMAL; //Normal
float2 Tex : TEXCOORD;
//Texture coordinate
float3 Tan : TANGENT; //Normalized Tangent vector
};
struct PSSkinnedIn
{
float4 Pos : SV_Position;
//Position
float3 vPos : POSWORLD; //world space Pos
float3 Norm : NORMAL; //Normal
float2 Tex : TEXCOORD;
//Texture coordinate
float3 Tangent : TANGENT;
//Normalized Tangent vector
};
//—————————————————————————————
// Constant buffers
//—————————————————————————————
cbuffer cb0
{
float4x4 g_mWorldViewProj;
float4x4 g_mWorld;
};
cbuffer cbUserChange
{
float3 g_vLightPos;
float3 g_vEyePt;
};
cbuffer cbImmutable
{
float4 g_directional = float4(1.0,1.0,1.0,1.0);
float4 g_ambient = float4(0.1,0.1,0.1,0.0);
float4 g_objectspeccolor = float4(1.0,1.0,1.0,1.0);
};
// Constant buffer for bone matrices
cbuffer cbAnimMatrices
{
matrix g_mConstBoneWorld[MAX_BONE_MATRICES];
};
// TBuffer for bone matrices
tbuffer tbAnimMatrices
{
matrix g_mTexBoneWorld[MAX_BONE_MATRICES];
};
//—————————————————————————————
// Textures
//—————————————————————————————
Texture2D g_txDiffuse;
Texture2D g_txNormal;
// Texture for bone matrices
Texture1D g_txTexBoneWorld;
//—————————————————————————————
// Buffers (this is the buffer object for bone matrices)
//—————————————————————————————
Buffer<float4> g_BufferBoneWorld;
//—————————————————————————————
// Texture samplers
//—————————————————————————————
SamplerState g_samLinear
{
Filter = ANISOTROPIC;
AddressU = Clamp;
AddressV = Clamp;
};
SamplerState g_samPoint
{
Filter = MIN_MAG_MIP_POINT;
AddressU = Clamp;
AddressV = Clamp;
};
//—————————————————————————————
// State
//—————————————————————————————
DepthStencilState DisableDepth
{
DepthEnable = FALSE;
DepthWriteMask = 0;
};
DepthStencilState EnableDepth
{
DepthEnable = TRUE;
DepthWriteMask = ALL;
};
//—————————————————————————————
// Helper struct for passing back skinned vertex information
//—————————————————————————————
struct SkinnedInfo
{
float4 Pos;
float3 Norm;
float3 Tan;
};
//—————————————————————————————
// FetchBoneTransform fetches a bone transformation using one of several methods
//
// FT_CONSTANTBUFFER:
// With this approach, the bone matrices are stored in a constant buffer.
// The shader will index into the constant buffer to grab the correct
// transformation matrices for each vertex.
// FT_TEXTUREBUFFER:
// This approach shows the differences between constant buffers and tbuffers.
// tbuffers are special constant buffers that are accessed like textures.
// They should give better random access performance.
// FT_TEXTURE:
// When FT_TEXTURE is specified, the matrices are loaded into a 1D texture.
// This is different from a tbuffer in that an actual texture fetch is used
// instead of a lookup into a constant buffer.
// FT_BUFFER:
// This loads the matrices into a buffer that is bound to the shader. The
// shader calls Load on the buffer object to load the different matrices from
// the stream. This should give better linear access performance.
//—————————————————————————————
matrix FetchBoneTransform( uint iBone)
{
matrix mret = g_mConstBoneWorld[ iBone ];
return mret;
}
//—————————————————————————————
// SkinVert skins a single vertex
//—————————————————————————————
SkinnedInfo SkinVert( VSSkinnedIn Input)
{
SkinnedInfo Output = (SkinnedInfo)0;
float4 Pos = float4(Input.Pos,1);
float3 Norm = Input.Norm;
float3 Tan = Input.Tan;
//Bone0
uint iBone = Input.Bones.x;
float fWeight = Input.Weights.x;
matrix m = FetchBoneTransform( iBone);
Output.Pos += fWeight * mul( Pos, m );
Output.Norm += fWeight * mul( Norm, (float3x3)m );
Output.Tan += fWeight * mul( Tan, (float3x3)m );
//Bone1
iBone = Input.Bones.y;
fWeight = Input.Weights.y;
m = FetchBoneTransform( iBone);
Output.Pos += fWeight * mul( Pos, m );
Output.Norm += fWeight * mul( Norm, (float3x3)m );
Output.Tan += fWeight * mul( Tan, (float3x3)m );
//Bone2
iBone = Input.Bones.z;
fWeight = Input.Weights.z;
m = FetchBoneTransform( iBone);
Output.Pos += fWeight * mul( Pos, m );
Output.Norm += fWeight * mul( Norm, (float3x3)m );
Output.Tan += fWeight * mul( Tan, (float3x3)m );
//Bone3
iBone = Input.Bones.w;
fWeight = Input.Weights.w;
m = FetchBoneTransform( iBone);
Output.Pos += fWeight * mul( Pos, m );
Output.Norm += fWeight * mul( Norm, (float3x3)m );
Output.Tan += fWeight * mul( Tan, (float3x3)m );
return Output;
}
//—————————————————————————————
// Vertex shader used for skinning the mesh for immediate render VSSkinnedmain
//—————————————————————————————
PSSkinnedIn VSSkinnedmain(VSSkinnedIn input)
{
PSSkinnedIn output;
SkinnedInfo vSkinned = SkinVert( input );
output.Pos = mul( vSkinned.Pos, g_mWorldViewProj );
output.vPos = mul( vSkinned.Pos, g_mWorld );
output.Norm = normalize( mul( vSkinned.Norm, (float3x3)g_mWorld ) );
output.Tangent = normalize( mul( vSkinned.Tan, (float3x3)g_mWorld ) );
output.Tex = input.Tex;
return output;
}
//—————————————————————————————
// Pixel shader that performs bump mapping on the final vertex PSSkinnedmain
//—————————————————————————————
float4 PSSkinnedmain(PSSkinnedIn input) : SV_Target
{
float4 diffuse = g_txDiffuse.Sample( g_samLinear, input.Tex );
float3 Norm = g_txNormal.Sample( g_samLinear, input.Tex );
Norm *= 2.0;
Norm -= float3(1,1,1);
// Create TBN matrix
float3 lightDir = normalize( g_vLightPos — input.vPos );
float3 viewDir = normalize( g_vEyePt — input.vPos );
float3 BiNorm = normalize( cross( input.Norm, input.Tangent ) );
float3x3 BTNMatrix = float3x3( BiNorm, input.Tangent, input.Norm );
Norm = normalize( mul( Norm, BTNMatrix ) ); //world space bump
//diffuse lighting
float lightAmt = saturate( dot( lightDir, Norm ) );
float4 lightColor = lightAmt.xxxx*g_directional + g_ambient;
// Calculate specular power
float3 halfAngle = normalize( viewDir + lightDir );
float4 spec = pow( saturate(dot( halfAngle, Norm )), 64 );
// Return combined lighting
return lightColor*diffuse + spec*g_objectspeccolor*diffuse.a;
}
//—————————————————————————————
// Render the scene by fetching bone matrices from a constant buffer
//—————————————————————————————
technique11 RenderConstantBuffer
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VSSkinnedmain( ) ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_5_0, PSSkinnedmain() ) );
SetDepthStencilState( EnableDepth, 0 );
}
}
I am trying to learn DX10 by following this tutorial. However, my shader won’t compile. Below is the detailed error message.
Build started 9/10/2012 10:22:46 PM.
1>Project "D:codedxEngineEngineEngine.vcxproj" on node 2 (Build target(s)).
C:Program Files (x86)Windows Kits8.0binx86fxc.exe /nologo /E"main" /Fo "D:codedxEngineDebugcolor.cso" /Od /Zi color.fx
1>FXC : error X3501: 'main': entrypoint not found
compilation failed; no code produced
1>Done Building Project "D:codedxEngineEngineEngine.vcxproj" (Build target(s)) -- FAILED.
Build FAILED.
Time Elapsed 00:00:00.05
I can easily compile the downloaded code, but I want to know how to fix this error myself.
My color.fx looks like this
////////////////////////////////////////////////////////////////////////////////
// Filename: color.fx
////////////////////////////////////////////////////////////////////////////////
/////////////
// GLOBALS //
/////////////
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
float4 position : POSITION;
float4 color : COLOR;
};
struct PixelInputType
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType ColorVertexShader(VertexInputType input)
{
PixelInputType output;
// Change the position vector to be 4 units for proper matrix calculations.
input.position.w = 1.0f;
// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);
// Store the input color for the pixel shader to use.
output.color = input.color;
return output;
}
////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
float4 ColorPixelShader(PixelInputType input) : SV_Target
{
return input.color;
}
////////////////////////////////////////////////////////////////////////////////
// Technique
////////////////////////////////////////////////////////////////////////////////
technique10 ColorTechnique
{
pass pass0
{
SetVertexShader(CompileShader(vs_4_0, ColorVertexShader()));
SetPixelShader(CompileShader(ps_4_0, ColorPixelShader()));
SetGeometryShader(NULL);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
# include <Windows.h> # include <windowsx.h> # include <d3d11.h> # include <d3dx11.h> # include <d3dx10.h> # pragma comment(lib,"d3d11.lib") # pragma comment(lib,"d3dx11.lib") # pragma comment(lib,"d3dx10.lib") ////DEFINES #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 //Глобальные переменные HWND hwnd; IDXGISwapChain* swapChain; // указатель на "swap chain interface" (буфферы) ID3D11Device *dev; // указатель на "Direct3D device interface" ID3D11DeviceContext *devcon; // указатель на "Direct3D device context" ID3D11RenderTargetView* backbuffer; // хранит всю информации об объекте рендеринга ID3D11VertexShader *pVS; // шейдер вершин ID3D11PixelShader *pPS; // шейдер пикселей ID3D11Buffer *pVBuffer; // буффер ID3D11InputLayout *pLayout; // слой struct VERTEX // вершина { FLOAT x, y, z; // позиция D3DXCOLOR color; // цвет }; // вершина //Прототипы функций LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // обработчик сообщений от винды /////////////DIRECTX//////////////////// void initD3D(HWND hwnd); // инициализация DirectX и настройка void CleanD3D(void); // закрытие DirectX и очистка памяти void RenderFrame(void); // рендеринг void InitPipeline(void); // ебашим шейдеры void InitGraphics(void); // инициализируем графончик /////////////////////////////////////// int CALLBACK WinMain ( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow ) { WNDCLASSEX mClass; mClass.cbSize = sizeof(mClass); // размер mClass.style = CS_HREDRAW | CS_VREDRAW;; // стиль окна(юзать битовое или) mClass.lpfnWndProc = WndProc; // функция - обработчик событий mClass.cbClsExtra = 0; // поля дополнительной информации mClass.cbWndExtra = 0; // класса и окна mClass.hInstance = hInstance; // дескриптор передаваемый при запуске WinMain(); (экземпляр приложения) mClass.hIcon = LoadIcon(0, IDI_APPLICATION); // выбираю стандартную иконку mClass.hCursor = LoadCursor(0, IDC_ARROW); // выбираю стандартный указатель mClass.hbrBackground = (HBRUSH)COLOR_WINDOW; // выбираю цвет фона (белая кисть) mClass.lpszMenuName = 0; // в приложении нет контекстного меню mClass.lpszClassName = L"mClass"; // имя класса mClass.hIconSm = LoadIcon(0, IDI_APPLICATION); // дескриптор пиктограммы в полосе заголовка RegisterClassEx(&mClass); // регистрируем класс в Windows // создание окна hwnd = CreateWindowEx( WS_EX_TOPMOST, // поверх остальных окон mClass.lpszClassName, // имя класса, на базе которого создаётся окно (mClass) L"Работает на иксах ёпт", // заголовок WS_OVERLAPPEDWINDOW // стиль | WS_VISIBLE, // окна 0, // позиция верхнего левого угла по X 0, // позиция верхнего левого угла по Y SCREEN_WIDTH, // ширина окна в пикселях SCREEN_HEIGHT, // высота окна в пикселях 0, // дескриптор родительского окна 0, // дескриптор меню hInstance, // экземпляр приложения (используется из WinMain() 0 ); if (!hwnd) // если не получилось создать return 0; // Инициализация DirectX initD3D(hwnd); // главный цикл сообщений MSG msg; msg.message = WM_NULL; while (1) // бесконечный цикл { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) // если вышли - выходим ;) break; TranslateMessage(&msg); // преобразование ввода DispatchMessage(&msg); // пересыл в обработчик события } RenderFrame(); //Выполнение игры //Game_Main(); } CleanD3D(); return(msg.wParam); } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; // painstruct PAINTSTRUCT ps; // дескриптор контекста устройства switch (message) { case WM_CREATE: // если приложение создаётся break; case WM_PAINT: // перерисовываем окно hdc = BeginPaint(hWnd, &ps); // рисовать тут EndPaint(hWnd, &ps); break; case WM_DESTROY: // выход PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, message, wParam, lParam)); // если нет нужного нам сообщения - обрабатывает Windows. break; } return 0; } void initD3D(HWND hwnd) { DXGI_SWAP_CHAIN_DESC scd; // структура для хранении информации о буфферах ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC)); // очищаем структуру для использования scd.BufferCount = 1; // один задний буффер scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // используем 32 битный режим scd.BufferDesc.Height = SCREEN_HEIGHT; // ширина scd.BufferDesc.Width = SCREEN_WIDTH; // высота scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // как буффер будет использоваться scd.OutputWindow = hwnd; // окно которое используем scd.SampleDesc.Count = 4; // как много (multisamples) scd.Windowed = TRUE; // на весь экран / не на весь экран scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; // автоматический переход на весь экран при нажатии alt+enter D3D11CreateDeviceAndSwapChain( NULL, // графич. адаптер (NULL - для автоопределения) D3D_DRIVER_TYPE_HARDWARE, // какой тип выбираем для рендеринга NULL, // не надо (медленно (хз почему ;)) NULL, // флаги для альтернативной работы NULL, // на сколько я понял здесь можно указать требования к железу NULL, // как много параметров мы указали выше D3D11_SDK_VERSION, // указываем на нашу версию DirectX &scd, // указатель на структуру информации о буфферах &swapChain, // указатель на указатель на "swap chain object" &dev, // указатель на указатель на "device object" NULL, // на сколько я понял - больше о требовании к железу (feature levels) &devcon // указатель на указатель на "device context object" ); // получаем адресс заднего буффера ID3D11Texture2D* pBackBuffer; // как я понял 2д картинка (текстура) swapChain -> GetBuffer( // функция находит задний буффер и использует его для создания pBackBuffer 0, // номер заднего буффера, у нас только один задний буффер (нумерация с 0) __uuidof(ID3D11Texture2D), // идентификационный номер ID3D11Texture2D COM объекта. __uuidof - оператор для просмотра ID (LPVOID*)&pBackBuffer); // // используем адрес заднего буффера чтобы создать цель для рендеринга dev -> CreateRenderTargetView( // функция создаёт объект для рендеринга pBackBuffer, // указатель на текстуру NULL, // структура описывающая текстуру &backbuffer); // указатель на объект pBackBuffer -> Release(); // закрывает все объект COM (этого типа). Это не уничтожает задний буффер, просто очищаем память // устанавливаем объект для рендеринга как задний буффер devcon -> OMSetRenderTargets( 1, // количество целей для рендеринга &backbuffer, // указатель на объект рендеринга NULL); // ADVANCED // устанавливаем нормальные координаты D3D11_VIEWPORT viewport; ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT)); viewport.TopLeftX = 0; viewport.TopLeftY = 0; viewport.Width = SCREEN_WIDTH; viewport.Height = SCREEN_HEIGHT; devcon -> RSSetViewports(1, &viewport); // применяем норм координаты (0,0) по середине экрана } void CleanD3D(void) // надо делать со всеми COM объектами! { swapChain -> SetFullscreenState(FALSE, NULL); // устанавливаем в режим окна // закрываем все существующие COM объекты pVS -> Release(); pPS -> Release(); swapChain -> Release(); dev -> Release(); devcon -> Release(); backbuffer -> Release(); } void RenderFrame(void) { // очищаем задний буффер в тёмно-голубой цвет devcon -> ClearRenderTargetView( backbuffer, // что заливаем D3DXCOLOR(0.4f, 0.4f, 1.0f, 0.0f) // каким цветом ); // рендеринг сюда извольте поместить, МЬСЁ // выбираем какой буффер вершин рисуем UINT stride = sizeof(VERTEX); UINT offset = 0; devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset); // какой тип примитива devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // рисуем devcon->Draw(3, 0); // меняем буффера местами swapChain -> Present(0, 0); // когда всё нарисовали! } void InitPipeline() { // читаем и компилим 2 шейдера ID3D10Blob* VS; ID3D10Blob* PS; D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0); D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0); // инкапсюлируем оба шейдера в объекты шейдера dev -> CreateVertexShader(VS -> GetBufferPointer(), VS -> GetBufferSize(), NULL, &pVS); // 1 - адресс компилируемой ин-ци, 2 - размер (1), 4 - адрес объекта шейдера, 3 - изучим потом dev -> CreatePixelShader(PS -> GetBufferPointer(), PS -> GetBufferSize(), NULL, &pPS); //----// // делаем шейдеры активными devcon -> VSSetShader(pVS, 0, 0); // 1 - адрес объекта для настройки, 2, 3 - advanced ( позже) devcon -> PSSetShader(pPS, 0, 0); //---// // создаём входной слой (// create the input layout object) D3D11_INPUT_ELEMENT_DESC ied [] = { {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout); } void InitGraphics() { VERTEX OurVertices [] = // создаём 3 вершины (треугольник) { {0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)}, { 0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) }, { -0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f) } }; D3D11_BUFFER_DESC bd; // структура, содержащая св-ва буффра ZeroMemory(&bd, sizeof(bd)); // инициализируем bd.Usage = D3D11_USAGE_DYNAMIC; // даём доступ GPU и CPU bd.ByteWidth = sizeof(VERTEX) * 3; // размер bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // юзаем буффер вершин bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // разрешаем CPU запись в буффер dev->CreateBuffer(&bd, NULL, &pVBuffer); // создаём буффер D3D11_MAPPED_SUBRESOURCE ms; devcon->Map(pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); // мапим memcpy(ms.pData, OurVertices, sizeof(OurVertices)); // копируем ин-фо devcon->Unmap(pVBuffer, NULL); // размапиваем ;) } |
I am trying to learn DX10 by following this tutorial. However, my shader won’t compile. Below is the detailed error message.
Build started 9/10/2012 10:22:46 PM.
1>Project "D:codedxEngineEngineEngine.vcxproj" on node 2 (Build target(s)).
C:Program Files (x86)Windows Kits8.0binx86fxc.exe /nologo /E"main" /Fo "D:codedxEngineDebugcolor.cso" /Od /Zi color.fx
1>FXC : error X3501: 'main': entrypoint not found
compilation failed; no code produced
1>Done Building Project "D:codedxEngineEngineEngine.vcxproj" (Build target(s)) -- FAILED.
Build FAILED.
Time Elapsed 00:00:00.05
I can easily compile the downloaded code, but I want to know how to fix this error myself.
My color.fx looks like this
////////////////////////////////////////////////////////////////////////////////
// Filename: color.fx
////////////////////////////////////////////////////////////////////////////////
/////////////
// GLOBALS //
/////////////
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
float4 position : POSITION;
float4 color : COLOR;
};
struct PixelInputType
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType ColorVertexShader(VertexInputType input)
{
PixelInputType output;
// Change the position vector to be 4 units for proper matrix calculations.
input.position.w = 1.0f;
// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);
// Store the input color for the pixel shader to use.
output.color = input.color;
return output;
}
////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
float4 ColorPixelShader(PixelInputType input) : SV_Target
{
return input.color;
}
////////////////////////////////////////////////////////////////////////////////
// Technique
////////////////////////////////////////////////////////////////////////////////
technique10 ColorTechnique
{
pass pass0
{
SetVertexShader(CompileShader(vs_4_0, ColorVertexShader()));
SetPixelShader(CompileShader(ps_4_0, ColorPixelShader()));
SetGeometryShader(NULL);
}
}
© Game Development or respective owner
Related posts about directx10
-
Reading from a staging 2D texture array in DirectX10
as seen on Game Development
— Search for ‘Game Development’
I have a DX10 program, where I create an array of 3 16×16 textures, then map, read, and unmap each subresource in turn. I use a single mip level, set resource usage to staging and CPU access to read. Now, here is the problem:
Subresource 0 contains 1024 bytes, pitch 64, as expected.
Subresource…
>>> More -
DirectX10 How to use Constant Buffers
as seen on Game Development
— Search for ‘Game Development’
I’m trying to access some variables in my shader, but I think I’m doing this wrong. Say I have a constant buffer that looks like this:
cbuffer perFrame
{
float foo;
float bar;
};
I got an ID3D10EffectConstantBuffer reference to it, and I can get a specific index by calling GetMemberByIndex…
>>> More -
DirectX11 Swap Chain Format
as seen on Game Development
— Search for ‘Game Development’
I was wondering if anyone could elaborate any further on something thats been bugging be me.
In DirectX9 the main supported back buffer formats were
D3DFMT_X8R8B8G8 and D3DFMT_A8R8G8B8 (Both being BGRA in layout).
http://msdn.microsoft.com/en-us/library/windows/desktop/bb174314(v=vs.85).aspx
With…
>>> More -
DirectX: How to render a texture to screen (DirectX10.1)
as seen on Stack Overflow
— Search for ‘Stack Overflow’
Hi,
I’m having some troubles finding out how i can render an offscreen texture to the
screen.
Can anyone help me with pointing me in the right direction?
Thx
>>> More -
Direct2d off-screen rendering and hardware acceleration
as seen on Game Development
— Search for ‘Game Development’
I’m trying to use direct2d to render images off-screen using WindowsAPICodePack. This is easily achieved using WicBitmapRenderTarget but sadly it’s not hardware accelerated.
So I’m trying this route:
Create direct3d device
Create texture2d
Use texture surface to create render target using CreateDxgiSurfaceRenderTarget
Draw…
>>> More
Categories cloud
«cmd» /c subst Z: «C:UsersRobertAppDataRoamingGameMakerStudio2CacheGMS2CACHE»
elapsed time 00:00:00.0937077s for command «cmd» /c subst Z: «C:UsersRobertAppDataRoamingGameMakerStudio2CacheGMS2CACHE» started at 03/10/2020 14:22:51
«cmd» /c subst Y: «C:UsersRobertAppDataLocalGameMakerStudio2GMS2TEMP»
elapsed time 00:00:00.0997345s for command «cmd» /c subst Y: «C:UsersRobertAppDataLocalGameMakerStudio2GMS2TEMP» started at 03/10/2020 14:22:51
«cmd» /c subst X: «C:ProgramDataGameMakerStudio2Cacheruntimesruntime-2.2.5.378»
elapsed time 00:00:00.0967436s for command «cmd» /c subst X: «C:ProgramDataGameMakerStudio2Cacheruntimesruntime-2.2.5.378» started at 03/10/2020 14:22:51
Saving project to: C:UsersRobertDocumentsGameMakerStudio2TestShaderTestShader.yyp
«C:ProgramData/GameMakerStudio2/Cache/runtimesruntime-2.2.5.378/bin/Igor.exe» -j=8 -options=»C:UsersRobertAppDataLocalGameMakerStudio2GMS2TEMPbuild.bff» -v — Windows Run
Loaded Macros from C:UsersRobertAppDataRoamingGameMakerStudio2CacheGMS2CACHETestShader_B4E72085macros.json
Options: X:/binplatform_setting_defaults.json
Options: C:UsersRobertAppDataRoaming/GameMakerStudio2robproctor83_89759local_settings.json
Options: C:UsersRobertAppDataRoamingGameMakerStudio2CacheGMS2CACHETestShader_B4E72085targetoptions.json
X://bin/GMAssetCompiler.exe /c /zpex /iv=0 /rv=0 /bv=0 /j=8 /gn=»TestShader» /td=»Y:/» /cd=»Z:/TestShader_B4E72085″ /zpuf=»C:UsersRobertAppDataRoaming/GameMakerStudio2robproctor83_89759″ /m=windows /tgt=64 /nodnd /cfg=»default» /o=»Y:/TestShader_71DA6EBE_VM» /sh=True /optionsini=»Y:/TestShader_71DA6EBE_VMoptions.ini» /cvm /baseproject=»X:/BaseProjectBaseProject.yyp» «C:UsersRobertDocumentsGameMakerStudio2TestShaderTestShader.yyp» /preprocess=»Z:/TestShader_B4E72085″
Reading project file….C:UsersRobertDocumentsGameMakerStudio2TestShader
Reading project file….X:BaseProject
Reading config delta ‘C:UsersRobertDocumentsGameMakerStudio2TestShaderoptionsmaininheritedoptions_main.inherited.yy’
finished.
X://bin/GMAssetCompiler.exe DONE (0)
Release build
Options: Z:/TestShader_B4E72085ExtensionOptions.json
OptionsIni
Options: Z:/TestShader_B4E72085PlatformOptions.json
[Compile] Run asset compiler
C:WINDOWSsystem32cmd.exe /c «»X://bin/GMAssetCompiler.exe» /c /zpex /iv=0 /rv=0 /bv=0 /j=8 /gn=»TestShader» /td=»Y:/» /cd=»Z:/TestShader_B4E72085″ /zpuf=»C:UsersRobertAppDataRoaming/GameMakerStudio2robproctor83_89759″ /m=windows /tgt=64 /nodnd /cfg=»default» /o=»Y:/TestShader_71DA6EBE_VM» /sh=True /optionsini=»Y:/TestShader_71DA6EBE_VMoptions.ini» /cvm /baseproject=»X:/BaseProjectBaseProject.yyp» «C:UsersRobertDocumentsGameMakerStudio2TestShaderTestShader.yyp» /bt=run /rt=vm»
Reading project file….C:UsersRobertDocumentsGameMakerStudio2TestShader
Reading project file….X:BaseProject
Reading config delta ‘C:UsersRobertDocumentsGameMakerStudio2TestShaderoptionsmaininheritedoptions_main.inherited.yy’
Compiling Shader Shader_shader0…Compile Errors for Shader_shader0: error X3501: ‘main’: entrypoint not found
finished.
Compile Constants…finished.
Remove DnD…finished.
Compile Scripts…finished.
Compile Objects…finished.
Compile Timelines…finished.
Compile Triggers…finished.
Compile Rooms…finished.
Compile Extensions…finished.
Global scripts…finished.
finished.
collapsing enums.
Final Compile…finished.
Saving IFF file… Y:/TestShader_71DA6EBE_VMTestShader.win
Writing Chunk… GEN8
option_game_speed=60
Writing Chunk… OPTN
Writing Chunk… LANG
Writing Chunk… EXTN
Writing Chunk… SOND
Writing Chunk… AGRP
Writing Chunk… SPRT
Writing Chunk… BGND
Writing Chunk… PATH
Writing Chunk… SCPT
Writing Chunk… GLOB
Writing Chunk… SHDR
Writing Chunk… FONT
Writing Chunk… TMLN
Writing Chunk… OBJT
Writing Chunk… ROOM
Writing Chunk… DAFL
Writing Chunk… EMBI
Writing Chunk… TPAGE
Writing Chunk… TGIN
Writing Chunk… CODE
Writing Chunk… VARI
Writing Chunk… FUNC
Writing Chunk… STRG
Writing Chunk… TXTR
Writing Chunk… AUDO
Writing Chunk… SCPT
Writing Chunk… DBGI
Writing Chunk… INST
Writing Chunk… LOCL
Writing Chunk… STRG
Stats : GMA : Elapsed=446.3565
Stats : GMA : sp=0,au=0,bk=0,pt=0,sc=0,sh=1,fo=0,tl=0,ob=0,ro=1,da=0,ex=0,ma=2,fm=0x0
C:WINDOWSsystem32cmd.exe DONE (0)
DoSteam
Igor complete.
[Run] Run game
Options: Z:/TestShader_B4E72085MainOptions.json
X://windows/Runner.exe -game «Y:/TestShader_71DA6EBE_VMTestShader.win»
Attempting to set gamepadcount to 12
DirectX11: Using hardware device
Collision Event time(microsecs)=1
Total memory used = 5423321(0x0052c0d9) bytes
**********************************.
Entering main loop.
**********************************.
Attempting to set gamepadcount to 0
Not shutting down steam as it is not initialised
X://windows/Runner.exe DONE (0)
Igor complete.
elapsed time 00:00:05.5896754s for command «C:ProgramData/GameMakerStudio2/Cache/runtimesruntime-2.2.5.378/bin/Igor.exe» -j=8 -options=»C:UsersRobertAppDataLocalGameMakerStudio2GMS2TEMPbuild.bff» -v — Windows Run started at 03/10/2020 14:22:51
«cmd» /c subst Z: /d
elapsed time 00:00:00.1196836s for command «cmd» /c subst Z: /d started at 03/10/2020 14:22:57
«cmd» /c subst Y: /d
elapsed time 00:00:00.1190439s for command «cmd» /c subst Y: /d started at 03/10/2020 14:22:57
«cmd» /c subst X: /d
elapsed time 00:00:00.1059811s for command «cmd» /c subst X: /d started at 03/10/2020 14:22:57
SUCCESS: Run Program Complete
В настоящее время я следую учебнику по DirectX 11 от www.rastertek.com во 2-й серии учебников. В настоящее время я использую VS2015 на Windows7 x64. После этого урока я использую комплект Windows 10.
Я успешно завершил первые 3 урока и смог визуализировать цветное окно, используя DirectX 11. Я только что закончил урок 4, чтобы отрисовать цветной треугольник, используя HLSL с вершиной. & пиксельные шейдеры. Я следую этому уроку, где и вершинный, и пиксельный шейдеры находятся в отдельных файлах, единственное отличие в моем коде — это расширение файла, которое я использую. Его сайт использует * .vs и * .ps соответственно, где я использую * .vsh и * .psh, так как это дает мне подсветку кода. Все мои файлы классов компилируются правильно, но когда я начинаю создавать свое решение, я получаю эту ошибку.
1>------ Build started: Project: DirectX 11 Engine, Configuration: Debug x64 ------
1>FXC : error X3501: 'main': entrypoint not found
1>
1> compilation failed; no code produced
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Создатель этого сайта не имеет контактной информации или форумов сообщества. Я не знаю, если это ошибка в учебнике веб-сайта или нет. Теперь я знаю, что этот код работал до использования более старых версий VS, таких как 2010, 2012 и 2013, в Windows Vista и Windows 7, использующих обе Windows 7 & Комплекты Windows 8 из его первой серии DirectX 10 & DirectX 11 учебники. Я не смог найти никакой помощи от www.msdn.com поскольку некоторые из их руководств написаны с требованием Windows 8 для DirectX 11 с использованием VS2013. Их документация тоже довольно скудная.
Одна из вещей, которые я заметил, отличается в DirectX 11 от Windows Kit от устаревшего выпуска Direct X SDK в июне 2010 года при компиляции файла шейдера следующим образом:
Июнь 2010 г. Direct X SDK — Область применения:
HRESULT result;
result = D3DX11CompileFromFile( "shaderFilename", NULL, NULL, "ShaderName", "*s_5_0" or "*s_5_1", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pShaderBuffer, &pErrorMessage, NULL );
Против…
Этот учебник (комплект Windows 10 от VS2015) — Область применения:
HRESULT result;
result = D3DCompileFromFile( "shaderFilename", NULL, NULL, "ShaderName", "*s_5_0" or "*s_5_1", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pShaderBuffer, &pErrorMessage );
Где имя файла шейдера, имя шейдера, уровень объекта и буфер шейдера являются вершинным или пиксельным типом шейдера. И уровень возможностей, используемый в обоих этих случаях, равен «5_0», а не «5_1», хотя я указал оба уровня функций.
Я не уверен, что изменилось между различными компиляторами для DirectX HLSL, и я не понимаю, откуда и почему генерируется эта ошибка. Я не знаю, отсутствует ли в исходном коде Shader из учебника веб-сайта что-либо или что-то не так, как свойство или настройка в VS2015, которые я не знаю. Я открыт для любых предложений, чтобы помочь решить эту проблему.
0
Решение
Visual Studio автоматически компилирует шейдеры для вас, используя FXC
, Вот, FXC
сообщает, что не может найти main
точка входа, то есть функция main
, Это по умолчанию, у вас есть 2 решения:
- Предполагая, что точка входа VertexShader
ColorVertexShader
(это в уроке, который вы связали), измените его наmain
- Измените точку входа в свойствах:
Right click on file -> Properties -> HLSL Compiler -> General -> Entrypoint name
Поскольку Visual Studio компилирует шейдеры для вас, вам не нужно самим компилировать их D3DCompileFromFile
рассмотрите возможность использования D3DReadFileToBlob
читать данные, а затем передавать их в CreateVertexShader
от ID3D11Device
,
Если ты не хочешь FXC
чтобы скомпилировать шейдеры, вы можете Right click on file -> Properties -> General -> Item type
— Измените это на Does not participate in build
3
Другие решения
Сообщение об ошибке является довольно явным, компилятор не может найти точку входа, по умолчанию это main
, Я думаю, что ваши шейдеры используют что-то вроде vsmain
или же psmain
…
Если вы посмотрите на документацию D3DCompileFromFile
, тогда вы увидите, что одним параметром является имя точки входа: https://msdn.microsoft.com/en-us/library/windows/desktop/hh446872(v=vs.85).aspx
Кроме того, представьте, что "*s_5_0" or "*s_5_1"
это ваш псевдокод, or
является устаревшей функцией в недавнем C ++, и здесь будет просто указатель или два и даст true, а функция компиляции не распознает подстановочные знаки.
0
После того, как я представил этот вопрос; Я случайно наткнулся на этот вопрос FXC: ошибка X3501: «главная»: точка входа не найдена и от некоторых комментариев и ответов там. Я просто нажал правой кнопкой мыши на файлах «color.psh» и «color.vsh» и под их свойствами:
- Свойства конфигурации -> Общие -> Исключено из раздела «Сборка» Я установил флаг «Да»
- Компилятор HLSL -> Общие -> Тип шейдера Я устанавливаю тип шейдера соответственно для пикселя & Вершинный шейдер для каждого файла.
- HLSL Compiler -> General -> Shader Model раздел Я установил Shader Model 5.0 (/ 5_0) для обоих файлов.
Теперь все строится успешно, и я рисую зеленый треугольник на черном оконном фоне, как и ожидалось.
0
When compiling my shader, I get the following error when compiling with fxc.exe:
error X3501: ‘main’: entrypoint not found
When even google failed me n this topic, I decided to post here. Anyone know how to fix this? What causes it?
int numLights;
float lengths[32];
float2 positions[32];
bool perPixelLighting = false;
float2 camPos;
texture tex : Diffuse
<
string ResourceName = "rgbcheck.bmp";
>;
sampler TextureSampler = sampler_state
{
Texture = (tex);
MinFilter = linear;
MagFilter = linear;
MipFilter = linear;
AddressU = mirror;
AddressV = mirror;
};
struct VertexIn
{
float2 pos : POSITION;
float2 texCoord : TEXCOORD0;
float4 color : COLOR0;
};
struct VertexOut
{
float4 pos : POSITION;
float2 texCoord : TEXCOORD0;
float2 wPos : TEXCOORD1;
float4 color : COLOR0;
};
struct PixelIn
{
float2 texCoord : TEXCOORD0;
float2 wPos : TEXCOORD1;
float4 color : COLOR0;
};
VertexOut VertexShaderFunction(VertexIn inval)
{
VertexOut outval = (VertexOut)0;
outval.wPos = inval.pos;
outval.pos = float4((inval.pos-camPos).xy,0,0);
outval.texCoord = inval.texCoord;
outval.color = inval.color;
}
float4 PixelShaderFunction(PixelIn inval) : COLOR0
{
float4 color = tex2D(TextureSampler, inval.texCoord);
float litval = 1;
return float4(color.rgb*litval,color.a);
}
technique Lighter
{
pass pass0
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
You need to specify what you want compiled. For example:
fxc /T fx_2_0 file.fx
Will compile the entire file with vs and ps 2.0.
fxc /T ps_2_0 /E PixelShaderFunction file.fx
Will compile PixelShaderFunction with ps 2.0.
Okay, great, that seemed to fix that problem!
Now I have a different one…
Failed to create D3D device
Please check your SDK installation.
disassembly failed; no disassembly produced
???
Louis