2016-11-05 44 views
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); 
} 

screenshot

+0

它在某種程度上取決於數據的外觀。法線是如何計算的?如果頂點是重複的而不是共享的,我期望這種外觀(因爲法線在每個面上都是恆定的)。 – warrenm

+0

實際上,問題是,我根據每個三角形的法線,從而導致每個頂點具有相同法線生成在OBJ裝載機法線和我沒有正常相鄰三角形之間共享。這是奇怪的事情是,相同的代碼不使用對象 - 所以我不知道爲什麼我沒有得到同樣的結果工作......我會盡量監測每個正常的兩個,並試圖瞭解爲什麼,謝謝幫助:) –

回答

0

所以問題哇使用OBJ-C,當我從OBJ文件索引頂點時,我只爲曲面之間的共享頂點生成了1個頂點,所以我只保留了1個正常。

當把它翻譯成swift時,我用來檢查頂點是否與我已經有的相同的地方的散列值是錯誤的,並且無法檢測到共享頂點,導致保留所有的法線,所以每個表面是平坦的。

我不知道我是不是足夠清晰但那是發生了什麼,以供將來參考,這個問題是關於製作「metalbyexample」一書的雨燕版本,它的OBJ-C只。