代码之家  ›  专栏  ›  技术社区  ›  Pedro Paulo Amorim sunshinejr

如何实施MSL排放

  •  0
  • Pedro Paulo Amorim sunshinejr  · 技术社区  · 4 年前

    我一直在学习Metal API(这里是新手),并使用示例和文档在我的iOS应用程序中创建3D动画。我知道我可以使用SceneKit,但目前我想了解和学习Metal API是如何工作的。

    其中之一 examples Apple为对象实现了相当数量的纹理映射,但缺少发射纹理。经过一番研究,我提出了这样的解决方案:

    float3 computeDiffuse(LightingParameters parameters)
    {
        float3 diffuseRawValue = float3(((1.0/PI) * parameters.baseColor) * (1.0 - parameters.metalness));
        return diffuseRawValue * parameters.nDotl * parameters.ambientOcclusion;
    }
    
    float3 computeSpecular(LightingParameters parameters)
    {
        float specularRoughness = parameters.roughness * (1.0 - parameters.metalness) + parameters.metalness;
    
        float Ds = Distribution(parameters.nDoth, specularRoughness);
    
        float3 Cspec0 = float3(1.0f);
        float3 Fs = float3(mix(float3(Cspec0), float3(1), Fresnel(parameters.hDotl)));
        float alphaG = sqr(specularRoughness * 0.5 + 0.5);
        float Gs = Geometry(parameters.nDotl, alphaG) * Geometry(parameters.nDotv, alphaG);
    
        float3 specularOutput = (Ds * Gs * Fs * parameters.irradiatedColor)
          * (1.0 + parameters.metalness * float3(parameters.baseColor))
          + float3(parameters.metalness)
          * parameters.irradiatedColor
          * float3(parameters.baseColor);
    
        return specularOutput * parameters.ambientOcclusion;
    }
    
    float3 computeEmissive(LightingParameters parameters)
    {
      float3 diffuseRawValue = float3(((1.0/PI) * parameters.emissiveColor));
      return diffuseRawValue;
    }
    
    //...
    
    fragment float4
    fragmentLighting(ColorInOut in [[stage_in]],
                     constant AAPLUniforms         & uniforms         [[ buffer(AAPLBufferIndexUniforms) ]],
                     constant AAPLMaterialUniforms & materialUniforms [[ buffer(AAPLBufferIndexMaterialUniforms) ]],
                     texture2d<float>   baseColorMap         [[ texture(AAPLTextureIndexBaseColor),        function_constant(has_base_color_map) ]],
                     texture2d<float>   normalMap            [[ texture(AAPLTextureIndexNormal),           function_constant(has_normal_map) ]],
                     texture2d<float>   metallicMap          [[ texture(AAPLTextureIndexMetallic),         function_constant(has_metallic_map) ]],
                     texture2d<float>   roughnessMap         [[ texture(AAPLTextureIndexRoughness),        function_constant(has_roughness_map) ]],
                     texture2d<float>   ambientOcclusionMap  [[ texture(AAPLTextureIndexAmbientOcclusion), function_constant(has_ambient_occlusion_map) ]],
                     texture2d<float>   emissiveMap          [[ texture(AAPLTextureIndexEmissive),         function_constant(has_emissive_map) ]],
                     texturecube<float> irradianceMap        [[ texture(AAPLTextureIndexIrradianceMap),    function_constant(has_irradiance_map)]])
    {
        float4 final_color = float4(0);
    
        LightingParameters parameters = calculateParameters(in,
                                                            uniforms,
                                                            materialUniforms,
                                                            baseColorMap,
                                                            normalMap,
                                                            metallicMap,
                                                            roughnessMap,
                                                            ambientOcclusionMap,
                                                            emissiveMap,
                                                            irradianceMap);
    
        final_color = float4(computeSpecular(parameters) + computeDiffuse(parameters) + computeEmissive(parameters), 1.0f);
    
        return final_color;
    
    }
    

    上面的代码使对象略微变白,这不是预期的效果。

    注意线条 computeSpecular(parameters) + computeDiffuse(parameters) + computeEmissive(parameters) ,在原始源代码中 computeEmissive(parameters) 不存在,这是我试图使颜色更强烈的东西,可能这是完全错误的,我应该做的是改变对比度、亮度和辉度,但我不知道该怎么做。

    我可能做错了一切,我愿意接受任何建议。:)

    非常感谢。

    0 回复  |  直到 4 年前