1
我一直在學習金屬如何使用Swift和定位macOS。事情已經好了,但現在,接近完成的東西,我碰到了一個我無法理解的問題...我希望你們會幫助我:)金屬正常不會插值
我加載並顯示OBJ茶壺,我使用ambiant + diffuse +鏡面光照明。照明在本身運作良好,但問題是:法向量不插打算片段着色器,這導致在假想曲面......不好有平面照明時...
我真的不明白爲什麼正常的不插而其他值(位置+眼)是...這是我的着色器和圖像顯示結果:
感謝提前:)
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);
}
它在某種程度上取決於數據的外觀。法線是如何計算的?如果頂點是重複的而不是共享的,我期望這種外觀(因爲法線在每個面上都是恆定的)。 – warrenm
實際上,問題是,我根據每個三角形的法線,從而導致每個頂點具有相同法線生成在OBJ裝載機法線和我沒有正常相鄰三角形之間共享。這是奇怪的事情是,相同的代碼不使用對象 - 所以我不知道爲什麼我沒有得到同樣的結果工作......我會盡量監測每個正常的兩個,並試圖瞭解爲什麼,謝謝幫助:) –