Macos 金属法线不';t插值
我一直在学习金属如何使用Swift和目标macOS。事情一直进展顺利,但现在,接近完成任务时,我遇到了一个我不可能理解的问题。。。我希望你们能帮助我:) 我正在加载并显示一个OBJ茶壶,我使用环境光+漫反射光+镜面反射光照明。照明本身工作得很好,但问题是:当转到片段着色器时,法线向量没有插值,这导致假定曲面上有平面照明。。。不好 我真的不明白为什么法线不是插值的,而其他值(位置+眼睛)是。。。以下是我的着色器和显示结果的图像: 提前感谢:)Macos 金属法线不';t插值,macos,shader,interpolation,metal,Macos,Shader,Interpolation,Metal,我一直在学习金属如何使用Swift和目标macOS。事情一直进展顺利,但现在,接近完成任务时,我遇到了一个我不可能理解的问题。。。我希望你们能帮助我:) 我正在加载并显示一个OBJ茶壶,我使用环境光+漫反射光+镜面反射光照明。照明本身工作得很好,但问题是:当转到片段着色器时,法线向量没有插值,这导致假定曲面上有平面照明。。。不好 我真的不明白为什么法线不是插值的,而其他值(位置+眼睛)是。。。以下是我的着色器和显示结果的图像: 提前感谢:) 所以问题是,使用OBJ-C,当我从OBJ文件索引顶点时
所以问题是,使用OBJ-C,当我从OBJ文件索引顶点时,我只为曲面之间的共享顶点生成了一个顶点,所以我只保留了一个法线 在将其转换为swift时,我用来检查顶点是否与我已有的顶点位于同一位置的哈希值是错误的,并且无法检测到共享顶点,这导致保留所有法线,因此每个曲面都是平面的
我不知道我是否足够清楚,但事实就是这样,为了将来的参考,这个问题是关于制作一本只有Obj-C的“metalbyexample”书的快速版本。所以问题是,使用Obj-C,当我从Obj文件索引顶点时,我只为曲面之间的共享顶点生成了一个顶点,所以我只保持了1个正常值 在将其转换为swift时,我用来检查顶点是否与我已有的顶点位于同一位置的哈希值是错误的,并且无法检测到共享顶点,这导致保留所有法线,因此每个曲面都是平面的
我不知道我是否足够清楚,但事实就是如此,为了将来的参考,这个问题是关于制作一本仅为Obj-C的“metalbyexample”书的快速版本。这在某种程度上取决于数据的外观。法线是如何计算的?如果顶点是重复的而不是共享的,我希望出现这种外观(因为法线在每个面上都是恒定的)。实际上,问题是我在OBJ加载程序中根据每个三角形的法线生成法线,这导致每个顶点具有相同的法线,而相邻三角形之间没有共享法线。奇怪的是,同样的代码使用Obj-C也能工作,所以我不知道为什么我不能得到同样的结果。。。我将试着监测这两种情况下的每一个正常值,并试着理解原因,感谢您的帮助:)这在某种程度上取决于数据的外观。法线是如何计算的?如果顶点是重复的而不是共享的,我希望出现这种外观(因为法线在每个面上都是恒定的)。实际上,问题是我在OBJ加载程序中根据每个三角形的法线生成法线,这导致每个顶点具有相同的法线,而相邻三角形之间没有共享法线。奇怪的是,同样的代码使用Obj-C也能工作,所以我不知道为什么我不能得到同样的结果。。。我将尝试监控这两种情况下的每种正常情况,并尝试了解原因,感谢您的帮助:)
struct Vertex
{
float4 position;
float4 normal;
};
struct ProjectedVertex
{
float4 position [[position]];
float3 eye;
float3 normal;
};
vertex ProjectedVertex vertex_project(device Vertex *vertices [[buffer(0)]],
constant Uniforms &uniforms [[buffer(1)]],
uint vid [[vertex_id]])
{
ProjectedVertex outVert;
outVert.position = uniforms.modelViewProjectionMatrix * vertices[vid].position;
outVert.eye = -(uniforms.modelViewProjectionMatrix * vertices[vid].position).xyz;
outVert.normal = (uniforms.modelViewProjectionMatrix * float4(vertices[vid].normal)).xyz;
return outVert;
}
fragment float4 fragment_light(ProjectedVertex vert [[stage_in]],
constant Uniforms &uniforms [[buffer(0)]])
{
float3 ambientTerm = light.ambientColor * material.ambientColor;
float3 normal = normalize(vert.normal);
float diffuseIntensity = saturate(dot(normal, light.direction));
float3 diffuseTerm = light.diffuseColor * material.diffuseColor * diffuseIntensity;
float3 specularTerm(0);
if (diffuseIntensity > 0)
{
float3 eyeDirection = normalize(vert.eye);
float3 halfway = normalize(light.direction + eyeDirection);
float specularFactor = pow(saturate(dot(normal, halfway)), material.specularPower);
specularTerm = light.specularColor * material.specularColor * specularFactor;
}
return float4(ambientTerm + diffuseTerm + specularTerm, 1);
}