• 引擎设计跟踪(九.14.3.3) Deferred shading的一些小细节


    1.ambient light

    之前的shader里面, 方向光会加上ambient 的计算. 但是如果没有方向光, 就没有ambient. 这是把全局方向光改为点光源之后发现的, 因为透明物体的forward shading是正常的, 其他的全是黑的.

    解决方法: 如果没有方向光, 就专门画一个单独quad来计算ambient lighting.

     1     //GBuffer color
     2     float2 colorUV = UV * colorUVSpace.zw + colorUVSpace.xy;
     3     float4 albedo = tex2D(colorBuffer, colorUV);
     4 #if defined(AMBIENT)
     5     return light_ambient*albedo;
     6 #endif
     7     //GBuffer normal
     8     float2 normalUV = UV * normalUVSpace.zw + normalUVSpace.xy;
     9     float4 normal = tex2D(normalBuffer, normalUV);
    10     float3 worldNormal = normalize(expand_vector(normal).xyz);
    11 #if defined(DIRECTIONAL)
    12     float4 diffuse = light_ambient;

    2.uv flip

    这个是因为DX9的纹理坐标系和OGL的相反, 而他们的屏幕坐标系却一样所导致. OGL的屏幕坐标系和UV坐标系都是向右X为正, 向上Y为正轴, 而DX9的屏幕坐标系和OGL一样, 但是UV坐标系相反, 所以render target中的内容是和正常使用贴图相比是Y反转的.

    在vertex shader里面flip一下屏幕坐标就可以了.

    IGraphicsManager有一个关于图像朝向的标记, 不同的API是不一样的, 这个flip的值通过CPU端计算再传入shader. 来保证API兼容.

    1             scalar flip = IGraphicsResourceManager::getSingleton().getGraphicsConfig().TextureDir == IMGO_TOP_DOWN ? -1.0f : 1.0f;
    2             mViewSize[3] = flip;

    另外, 因为现在所有光源都使用了quad, 所以可以在vertex shader 里面计算uv. 之前point light和spot light使用的volume, 因为要做perspective correction 之后才能在pixel shader里面做perspective divide( /w), 现在因为是平面, 不需要再pixel shader里面计算, vertex shader里面 /w 就可以了.

    3. half pixel/texel offset

    这个也是为了兼容性: 目前只有DX9需要这个trick, DX10+以及OGL都不需要.  现在在IGraphicsResourceManager里面加了一个flag, runtime做判断, 根据API的设置来确定是否要计算, 这样可以兼容所有的API.

    1                 scalar fHalfPixelOffsetX = 0;
    2                 scalar fHalfPixelOffsetY = 0;
    3                 if (IGraphicsResourceManager::getSingleton().getGraphicsConfig().HalfTexel2Pixel)
    4                 {
    5                     fHalfPixelOffsetX = 0.5f / (scalar)width;
    6                     fHalfPixelOffsetY = 0.5f / (scalar)height;
    7                 }        
  • 相关阅读:
    C语言数据结构_严蔚敏+吴伟民 课本源码
    html5下F11全屏化的几点注意
    jquery中的globalEval()源码分析
    jquery中的 parseJSON() 源码分析
    javascript正则表达式分组捕获理解
    IE6-IE9中tbody的innerHTML不能赋值
    jquery中的 jquery.contains(a,b)
    jquery中的 deferred之 when (三)
    mac下apache配置,解决It is not safe to rely on the system's timezone settings.
    服务器大量TIME_WAIT和CLOSE_WAIT的原因及解决办法
  • 原文地址:https://www.cnblogs.com/crazii/p/5350321.html
Copyright © 2020-2023  润新知