gpt4 book ai didi

c++ - 无法从cso文件创建顶点着色器(从fx文件创建)

转载 作者:行者123 更新时间:2023-12-02 10:07:09 25 4
gpt4 key购买 nike

Shader在构建时成功编译为cso文件。但是,当我尝试调用CreateVertexShader时,出现错误:

D3D11错误:ID3D11Device::CreateVertexShader:编码的顶点着色器大小与指定的大小不匹配。

我将着色器类型设置为“Effect(/ fx)”,入口点设置为“VS”,着色器模型为5.0。

我尝试了4.0、4.1模型-错误有所不同:

D3D11错误:ID3D11Device::CreateVertexShader:着色器已损坏或格式无法识别。

我的代码:

ID3DBlob* pVSBlob = NULL;
HRESULT hr = D3DReadFileToBlob((WCHAR*)name.c_str(), &pVSBlob);
if (FAILED(hr))
{
return;
}

hr = g_pd3dDevice->CreateVertexShader(pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &vertexShader);

设备功能:
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_12_1,
D3D_FEATURE_LEVEL_12_0,
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};

我的着色器代码:
cbuffer cbTrunkCutMode : register(b1)
{
float HighlightAdj;
};

cbuffer cbChangesEveryFrame : register(b0)
{
matrix Matrices[2];
};


struct VS_INPUT
{
float3 VertexPosition_modelspace : POSITION;
float3 vertexNormal_modelspace : NORMAL;
float age : AGE;
};

struct PS_INPUT
{
float4 Position : SV_POSITION;
float3 Position_worldspace : WSPOSITION;
float3 Normal_cameraspace : NORMAL;
float3 EyeDirection_cameraspace : EYEDIRECTION;
float age : AGE;
};

PS_INPUT VS(VS_INPUT input)
{
PS_INPUT output;
output.Position= mul(Matrices[1], float4(input.VertexPosition_modelspace, 1.0));
output.Position_worldspace = input.VertexPosition_modelspace;

float3 vertexPosition_cameraspace = mul(Matrices[0], float4(input.VertexPosition_modelspace,1.0)).xyz;
output.EyeDirection_cameraspace = float3(0.0, 0.0, 0.0) - vertexPosition_cameraspace;

output.Normal_cameraspace = mul((float3x3)Matrices[0], input.vertexNormal_modelspace); // Only correct if ModelMatrix does not scale the model ! Use its inverse transpose if not.
output.age = input.age;

return output;
}

static const float3 LightPosition = normalize(float3(1.0, 1.0, 1.0));

float4 PS(PS_INPUT input) : SV_Target
{
float3 MaterialDiffuseColor = float3(0.05,0.3,0.05);
float3 MaterialAmbientColor = float3(0.3, 0.3, 0.3) * MaterialDiffuseColor;
float3 MaterialSpecularColor = 0.5*MaterialDiffuseColor;

float3 n = normalize(input.Normal_cameraspace);
float3 l = LightPosition;
float cosTheta = clamp(dot(n,l), 0.0,1.0);

float3 E = normalize(input.EyeDirection_cameraspace);
float3 R = reflect(-l,n);
float cosAlpha = clamp(dot(E,R), 0.0,1.0);

return float4((
float3(HighlightAdj - input.age, -HighlightAdj, -input.age - HighlightAdj) +
MaterialAmbientColor +
MaterialDiffuseColor * cosTheta +
MaterialSpecularColor * pow(cosAlpha, 5.0)),1);
}

最佳答案

Visual Studio的内置HLSL生成规则对小型项目很有用,但要牢记一个概念:Visual Studio的项目系统假定每个源文件都用于生成一个编译的目标文件(在本例中为.cso)。

为了在同一文件中合并着色器类型时使此工作有效,您只需要创建一些其他文件即可。例如:

第一个文件是MyShader.hlsli。这将包含VS和PS的组合着色器代码

第二个文件MyShaderVS.hlsl

#include "MyShader.hlsli"

第三个文件 MyShaderPS.hlsl
#include "MyShader.hlsli"

然后,您可以设置VS Project的构建属性,以将 MyShaderVS.hlsl构建为顶点着色器( /vs)。您将 MyShaderPS.hlsl构建为Pixel Shader( /ps)。设置适合每个像素的入口点。

结果将使您的原始着色器代码多次构建。

The Effects file system that had one .fx that compiled into lots of shader blobs all in one compiled object works with the Visual Studio system, but (a) the compiler support is deprecated, and (b) you need a runtime library to use it from GitHub. Using HLSL shader types instead is recommended. See the wiki.

关于c++ - 无法从cso文件创建顶点着色器(从fx文件创建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59650658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com