在 Metal Shader Vertex 函数中出错
Getting error in Metal Shader Vertex function
代码库有点旧,正在努力支持最新的 iOS 版本。它过去工作正常,但现在出现以下错误。
vertex function has invalid return type 'ColorInOut'
下面是金属着色器代码的一部分。你可以获得完整的代码here。
typedef struct
{
packed_float3 position;
packed_float3 normal;
packed_float2 texCoord1;
packed_float3 tangent;
packed_float3 bitagent;
packed_float4 vertColor;
} vertex_t;
typedef struct
{
float4 position [[position]] , vertexPosition_ws;
float2 uv,texture2UV;
float hasLighting;
float pointSize [[point_size]];
float vertexDepth, reflection;
float hasMeshColor;
float shadowDarkness, transparency;
float2 pointCoord [[ point_coord ]];
float4 eyeVec, lightDir, lightColor;
float3 meshColor;
float3 T;
float3 B;
float3 N;
} ColorInOut;
vertex ColorInOut Mesh_Vertex(device vertex_t* vertex_array [[ buffer(0) ]],
constant float4x4& vp [[ buffer(SHADER_MESH_mvp) ]],
constant MatArray* model [[ buffer(SHADER_MESH_model) ]],
constant float4x4& lvp [[ buffer(SHADER_MESH_lightViewProjMatrix) ]],
constant packed_float3& eyePos [[ buffer(SHADER_MESH_eyePos) ]],
constant float& shadowDarkness [[ buffer(SHADER_MESH_shadowDarkness) ]],
constant float *hasMeshColor [[ buffer(SHADER_MESH_hasMeshColor) ]],
constant float *reflectionValue [[ buffer(SHADER_MESH_reflectionValue) ]],
constant float *transparency [[ buffer(SHADER_MESH_transparency) ]],
constant float *hasLighting [[ buffer(SHADER_MESH_hasLighting) ]],
constant float *uvScaleValue [[ buffer(SHADER_MESH_uvScale) ]],
constant float3Struct *meshColor [[buffer(SHADER_MESH_meshColor)]],
unsigned int vid [[ vertex_id ]],
unsigned int iId [[ instance_id ]]
)
{
float4 vertexPosition_ws = model[iId].data * float4(float3(vertex_array[vid].position), 1.0);
float4 vertColor = float4(vertex_array[vid].vertColor);
float3 tangent = float3(vertex_array[vid].tangent);
float3 bitangent = float3(vertex_array[vid].bitagent);
float3 normal = float3(vertex_array[vid].normal);
ColorInOut out;
out.hasMeshColor = hasMeshColor[iId];
out.meshColor = (meshColor[iId].data[0] == -1.0) ? vertColor.xyz : float3(meshColor[iId].data);
out.reflection = reflectionValue[iId];
out.T = normalize(float3(model[iId].data * float4(tangent, 0.0)));
out.B = normalize(float3(model[iId].data * float4(bitangent, 0.0)));
out.N = normalize(float3(model[iId].data * float4(normal, 0.0)));
out.vertexPosition_ws = vertexPosition_ws;
out.transparency = transparency[iId];
out.hasLighting = hasLighting[iId];
out.position = vp * vertexPosition_ws;
out.uv = vertex_array[vid].texCoord1 * uvScaleValue[iId];
out.shadowDarkness = 0.0;
if(bool(hasLighting[iId])) {
float4 vertexLightCoord = lvp * vertexPosition_ws;
float4 texCoords = vertexLightCoord/vertexLightCoord.w;
out.texture2UV = float4((texCoords / 2.0) + 0.5).xy;
out.texture2UV.y = (1.0 - out.texture2UV.y); // need to flip metal texture vertically
out.vertexDepth = texCoords.z;
out.shadowDarkness = shadowDarkness;
}
float4 eye_position_ws = vertexPosition_ws - float4(float3(eyePos), 1.0);
out.eyeVec = normalize(eye_position_ws);
return out;
}
我怀疑你引用的是整个错误信息。询问错误消息时,请始终包括完整的逐字消息。
也就是说,我最好的猜测是 [[ point_coord ]]
不是顶点函数输出的有效属性。
另一件事是您应该将输入参数 vertex_array
声明为 const
以便 Metal 知道您不会写入它:
device const vertex_t* vertex_array [[ buffer(0) ]]
写入缓冲区或纹理的顶点着色器只能return void
.
代码库有点旧,正在努力支持最新的 iOS 版本。它过去工作正常,但现在出现以下错误。
vertex function has invalid return type 'ColorInOut'
下面是金属着色器代码的一部分。你可以获得完整的代码here。
typedef struct
{
packed_float3 position;
packed_float3 normal;
packed_float2 texCoord1;
packed_float3 tangent;
packed_float3 bitagent;
packed_float4 vertColor;
} vertex_t;
typedef struct
{
float4 position [[position]] , vertexPosition_ws;
float2 uv,texture2UV;
float hasLighting;
float pointSize [[point_size]];
float vertexDepth, reflection;
float hasMeshColor;
float shadowDarkness, transparency;
float2 pointCoord [[ point_coord ]];
float4 eyeVec, lightDir, lightColor;
float3 meshColor;
float3 T;
float3 B;
float3 N;
} ColorInOut;
vertex ColorInOut Mesh_Vertex(device vertex_t* vertex_array [[ buffer(0) ]],
constant float4x4& vp [[ buffer(SHADER_MESH_mvp) ]],
constant MatArray* model [[ buffer(SHADER_MESH_model) ]],
constant float4x4& lvp [[ buffer(SHADER_MESH_lightViewProjMatrix) ]],
constant packed_float3& eyePos [[ buffer(SHADER_MESH_eyePos) ]],
constant float& shadowDarkness [[ buffer(SHADER_MESH_shadowDarkness) ]],
constant float *hasMeshColor [[ buffer(SHADER_MESH_hasMeshColor) ]],
constant float *reflectionValue [[ buffer(SHADER_MESH_reflectionValue) ]],
constant float *transparency [[ buffer(SHADER_MESH_transparency) ]],
constant float *hasLighting [[ buffer(SHADER_MESH_hasLighting) ]],
constant float *uvScaleValue [[ buffer(SHADER_MESH_uvScale) ]],
constant float3Struct *meshColor [[buffer(SHADER_MESH_meshColor)]],
unsigned int vid [[ vertex_id ]],
unsigned int iId [[ instance_id ]]
)
{
float4 vertexPosition_ws = model[iId].data * float4(float3(vertex_array[vid].position), 1.0);
float4 vertColor = float4(vertex_array[vid].vertColor);
float3 tangent = float3(vertex_array[vid].tangent);
float3 bitangent = float3(vertex_array[vid].bitagent);
float3 normal = float3(vertex_array[vid].normal);
ColorInOut out;
out.hasMeshColor = hasMeshColor[iId];
out.meshColor = (meshColor[iId].data[0] == -1.0) ? vertColor.xyz : float3(meshColor[iId].data);
out.reflection = reflectionValue[iId];
out.T = normalize(float3(model[iId].data * float4(tangent, 0.0)));
out.B = normalize(float3(model[iId].data * float4(bitangent, 0.0)));
out.N = normalize(float3(model[iId].data * float4(normal, 0.0)));
out.vertexPosition_ws = vertexPosition_ws;
out.transparency = transparency[iId];
out.hasLighting = hasLighting[iId];
out.position = vp * vertexPosition_ws;
out.uv = vertex_array[vid].texCoord1 * uvScaleValue[iId];
out.shadowDarkness = 0.0;
if(bool(hasLighting[iId])) {
float4 vertexLightCoord = lvp * vertexPosition_ws;
float4 texCoords = vertexLightCoord/vertexLightCoord.w;
out.texture2UV = float4((texCoords / 2.0) + 0.5).xy;
out.texture2UV.y = (1.0 - out.texture2UV.y); // need to flip metal texture vertically
out.vertexDepth = texCoords.z;
out.shadowDarkness = shadowDarkness;
}
float4 eye_position_ws = vertexPosition_ws - float4(float3(eyePos), 1.0);
out.eyeVec = normalize(eye_position_ws);
return out;
}
我怀疑你引用的是整个错误信息。询问错误消息时,请始终包括完整的逐字消息。
也就是说,我最好的猜测是 [[ point_coord ]]
不是顶点函数输出的有效属性。
另一件事是您应该将输入参数 vertex_array
声明为 const
以便 Metal 知道您不会写入它:
device const vertex_t* vertex_array [[ buffer(0) ]]
写入缓冲区或纹理的顶点着色器只能return void
.