立体渲染(Stereo Rendering)

2023-11-04



GPU架构浅析
首发于 GPU架构浅析
写文章
Multi-View与Multi-Viewport

Multi-View与Multi-Viewport

Junior GPU Architect
14 人赞了该文章

随着VR的流行,内置地支持multi-view和multi-viewport已经成为GPU的一种需要。当前GPU主要通过支持已有的扩展来内置实现multi-view和multi-viewport,本篇对常见的几个扩展做下总结。

1. Stereo rendering与Multi-view

Stereo Rendering(立体渲染)是一种让人眼能感受到立体效果的渲染方式,为给予人眼立体效果,需要2个Camera对同一个场景进行成像,即设置不同的View矩阵渲染两张图像,这两张略有差异的图片能使人眼感觉出深度。

在普通的pipeline下,立体渲染的一种方案是在Vertex Shader中实现按不同View渲染两次[1]:

Set MVP_L for left camera
Rendering Geometry
Set MVP_R for right camera
Rendering Geometry

可以看到,同样的Geometry被重复渲染了两遍,CPU-GPU的带宽加倍,而这两份Geometry大部分Shading计算(如Model Transform,Attribute计算等)是相同的,仅仅只有View矩阵存在差异。这些数据或计算上的冗余显然可以在GPU内部优化,以提高Performance

另一种方案是起Geometry Shader,在GS里边给每个View送出各自的position或attribute:

for(int view_id  =0; view_id < 2; view_id++)
{
    MVP = MVP_Matrix[view_id];
    gl_Position = MVP * in_position;
}

这样能避免CPU-GPU带宽问题,同时可以避免相同属性的重复运算,但GS的performance本身并不理想。在GS单个Shader中loop过多的顶点属性,本身会使用较多资源,进而限制Shading的并行度。

OVR_multiview扩展旨在让GPU支持更高效的Multiview rendering(最常见是2个View),启用该扩展时,GPU将在Vertex Shader(VS)中loop,使用ViewID得到per-view的属性,如position和依赖于view的normal(OVR_multiview只允许position依赖于view_ID,不过新的扩展OVR_multiview2放宽了限制,允许其他属性根据view_ID取值)。

新的函数FramebufferTextureMultiviewOVR与FramebufferTextureMultiview类似,但它会使支持该扩展的GPULoop多次。

FramebufferTextureMultiviewOVR( enum target, enum attachment, uint texture, int level, int baseViewIndex, sizei numViews );

一个简单的例子[2],在VS中,我们用modelViewProjection[gl_ViewID_OVR]获取MVP矩阵,而同样的几何体会被渲染两遍,第一次gl_ViewID_OVR=0,第二次gl_ViewID_OVR=1。

#version 300 es
#extension GL_OVR_multiview : enable
layout(num_views = 2) in;
in vec3 vertexPosition;
in vec3 vertexNormal;
uniform mat4 modelViewProjection[2];
uniform mat4 model;
out vec3 v_normal;
void main()
{
gl_Position = modelViewProjection[gl_ViewID_OVR] * vec4(vertexPosition, 1.0);
v_normal = (model * vec4(vertexNormal, 0.0f)).xyz;
}
#version 300 es
precision mediump float;
in vec3 v_normal;
out vec4 f_color;
vec3 light(vec3 n, vec3 l, vec3 c)
{
float ndotl = max(dot(n, l), 0.0);
return ndotl * c;
}
void main()
{
vec3 albedo = vec3(0.95, 0.84, 0.62);
vec3 n = normalize(v_normal);
f_color.rgb = vec3(0.0);
f_color.rgb += light(n, normalize(vec3(1.0)), vec3(1.0));
f_color.rgb += light(n, normalize(vec3(-1.0, -1.0, 0.0)), vec3(0.2, 0.23, 0.35));
f_color.a = 1.0;
}

Shader里输出各自数据给每个View,使用ViewID索引出相应的数据,渲染结果被写到2D array texture的两个slice中,在VR设备中会显示到两个屏幕上。


OVR_multiview除了用来给2只眼睛发送各自的view外,另一个可能的用途是给每只眼睛送出2笔不同分辨率的View,人眼成像通常是中心清晰而周围模糊些。因此,对于中心出给高分辨率,四周给低分辨率,这样可减少像素的渲染。

不过,OVR_multiview还是有不少的限制:
不支持transform feedback(DX的Stream output)、tessellation control or evaluation shaders以及geometry shader

2. Multi Viewport

2.1 NV_viewport_array2

Multi-viewport,即在一个Shader中把primitive同时渲染到多个Viewport上去时。Geometry Shader是最常规的选择,因为只有GS才能看到整个per-primitive的build-in属性gl_ViewportIndex。 NV_viewport_array2扩展便是为了支持比GS Loop更高效的Multi-viewport, 应用可在Vertex Shader/Control Shader/Evaluatoin Shader/Geometry Shader设置build-in属性gl_ViewportMask指定需要发送的viewport,而GPU原则上可用可编程或Fixed Function的方式,在Raster之前Loop每个有效的viewport,并把Raster结果送出。

通过viewport_relative声明,NV_viewport_array2还支持把vertex emit到不同的layer上

 layout (viewport_relative) out highp int gl_Layer;

因此,GPU内部的逻辑过程大概是这样子的:

//In a vertex shader or evaluation shader
for(int i=0; i<Viewport_Num; i++
{
  if((viewport_mask>>i)&1)
  {
     gl_layer+=(viewport_relative) ? i : 0;
  }
  
  Emit vertex;

  }
}

这个扩展被Nvidia Maxwell用于cubemap rendering的加速


2.2 NV_viewport_swizzle

在一些multi viewport的应用中(比如通过单个pass把primitive渲染到cube的6个面上),有时顶点position可能需要简单的修改,比如通过翻转,XY坐标的互换来简单调整每个面上物体的朝向。NV_viewport_swizzle支持per-viewport swizzle,应用可以通过函数设置XYZW的swizzle方式

    void ViewportSwizzleNV(uint index,
                           enum swizzlex, enum swizzley,
                           enum swizzlez, enum swizzlew)

其中swizzlex,swizzley,swizzlez,swizzlew的取值可以是

        VIEWPORT_SWIZZLE_POSITIVE_X_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_X_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_Y_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_Y_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_Z_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_Z_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_W_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_W_NV                  

以swizzlex为例,对于这8中swizzle方式,GPU将对position坐标做不同的调整:

        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_X_NV) x' = x;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_X_NV) x' = -x;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_Y_NV) x' = y;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_Y_NV) x' = -y;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_Z_NV) x' = z;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_Z_NV) x' = -z;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_W_NV) x' = w;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_W_NV) x' = -w;

swizzle针对的坐标是clipping space坐标,即在转化成NDC坐标之前执行swizzle。设置设置适当的swizzle,可以借助GPU直接渲染到cube map的6个面上。

一个例子:

      layout(triangles) in;
      layout(passthrough) in Inputs {
        vec2 texcoord;
        vec3 normal;
        vec4 baseColor;
      }
      layout(passthrough) in gl_PerVertex {
        vec4 gl_Position;
      } gl_in[];
      layout(viewport_relative) out int gl_Layer;

      void main()
      {
        // Figure out which faces the primitive projects onto and
        // generate a corresponding viewport mask.
        uint mask = 0;
        for (int i = 0; i < 6; i++) {
          if (!shouldCull(face)){//If primitive don't project onto this face
            mask |= 1U << i;
          }
        }
        gl_ViewportMask = mask;
        gl_Layer = 0;
      }



3. w scaling与分辨率


NV_clip_space_w_scaling

通常渲染结束后,整张图像还需要做一次后处理——Barrel distortion(桶形失真),以抵消VR设备固有的pincushion distortion(枕形失真)。而经过Barrel distortion的图像的特点边沿的分辨率较低,这意味着原始图像靠近边沿的许多像素对最终的校正图像并无贡献[3]。


NV_clip_space_w_scaling为VR应用提供w-scaling的功能,通过AP为viewport指定两个参数xcoeff和ycoeff:

void ViewportPositionWScaleNV(uint index, float xcoeff, float ycoeff);

GPU负责在Perspective division和Viewport Transform之前对w做以下scaling:

w' = xcoeff * x + ycoeff * y + w;

对于4个象限设置不同符号的xcoeff/ycoeff(需要把所有Geometry重复画到4个同样的viewport上,但每次只scissor出一个象限),使得距离中心越远则w越大,分辨率越低。

GPU只负责做w-scaling使得分辨率呈线性变化,至于un-scaling和后处理(barrel distortion)还是需要AP完成。下面的fragment shader可以包含到后处理的Shader中,负责做un-scale,然后让后处理继续做barrel distortion。

        // Vertex Shader
        // Draw a triangle that covers the whole screen
        const vec4 positions[3] = vec4[3](vec4(-1, -1, 0, 1),
                                          vec4( 3, -1, 0, 1),
                                          vec4(-1,  3, 0, 1));
        out vec2 uv;
        void main()
        {
          vec4 pos = positions[ gl_VertexID ];
          gl_Position = pos;
          uv = pos.xy;
        }

        // Fragment Shader
        uniform sampler2D tex;
        uniform float xcoeff;
        uniform float ycoeff;
        out vec4 Color;
        in vec2 uv;

        void main()
        {
          // Handle uv as if upper right quadrant
          vec2 uvabs = abs(uv);

          // unscale: transform w-scaled image into an unscaled image
          //   scale: transform unscaled image int a w-scaled image
          float unscale = 1.0 / (1 + xcoeff * uvabs.x + xcoeff * uvabs.y);
          //float scale = 1.0 / (1 - xcoeff * uvabs.x - xcoeff * uvabs.y);

          vec2 P = vec2(unscale * uvabs.x, unscale * uvabs.y);

          // Go back to the right quadrant
          P *= sign(uv);

          Color = texture(tex, P * 0.5 + 0.5);
        }

Reference

[1] Optimizing Virtual Reality: Understanding Multiview

[2] Using multiview rendering - Mali Developer Center

[3] Optimizing VR renderers with OVR_multiview - Imagination Technologies

[4] NVIDIA OpenGL in 2016

图形处理器(GPU)
14 ​1 条评论
​分享
​收藏

文章被以下专栏收录

GPU架构浅析
通过专栏与大家交流探讨GPU Pipeline相关的图形学知识,以及GPU架构问题。

推荐阅读

前端如何适配手机屏幕之viewport

前端如何适配手机屏幕之viewport

Larry 发表于互联网笔记

响应式网页开发基础:DPR 与 viewport

响应式设计与开发中,有两个重要的概念,一直会贯穿整个流程,但是又有很多人搞不清楚。它们就是 DPR 与 viewport,下面让我们看看这两个概念。什么是 DPR?我们知道在 Chrome 浏览器控制台…

tedlife

响应式网页开发基础:DPR 与 viewport

响应式设计与开发中,有两个重要的概念,一直会贯穿整个流程,但又有很多人搞不清楚。它们就是 DPR 与 viewport,下面让我们看看这两个概念。什么是 DPR?我们知道在 Chrome 浏览器控制台 c…

优达学城(... 发表于Udaci...
前端每周清单第 31 期: iOS 11 Viewport 解析,Preact PWA 性能优化案例,JS 内存泄露分析

前端每周清单第 31 期: iOS 11 Viewport 解析,Preact PWA 性能优化案例,JS 内存泄露分析

王下邀月熊 发表于前端之巅

1 条评论

​切换为时间排序
写下你的评论...
评论
安迪的夏 11 个月前
去年帕斯卡发布会上,有一个VRworks方面的新特性Single Pass Stereo,基于多重同步投影技术,单次渲染再投射以实现左右的view
不过目前除了fun house似乎还没有什么实际应用...
多重同步投影的应用很宽泛,最直接的便是能解决三联屏这样的环绕透视的扭曲,其实哪怕16:9单屏都存在边缘扭曲的现象,不过这个技术的实现依赖于游戏开发者的附加,除了ansel以外其他诸多新技术都不是驱动层可调用的.
赞回复踩举报
GPU架构浅析
首发于 GPU架构浅析
写文章
Multi-View与Multi-Viewport

Multi-View与Multi-Viewport

Junior GPU Architect
14 人赞了该文章

随着VR的流行,内置地支持multi-view和multi-viewport已经成为GPU的一种需要。当前GPU主要通过支持已有的扩展来内置实现multi-view和multi-viewport,本篇对常见的几个扩展做下总结。

1. Stereo rendering与Multi-view

Stereo Rendering(立体渲染)是一种让人眼能感受到立体效果的渲染方式,为给予人眼立体效果,需要2个Camera对同一个场景进行成像,即设置不同的View矩阵渲染两张图像,这两张略有差异的图片能使人眼感觉出深度。

在普通的pipeline下,立体渲染的一种方案是在Vertex Shader中实现按不同View渲染两次[1]:

Set MVP_L for left camera
Rendering Geometry
Set MVP_R for right camera
Rendering Geometry

可以看到,同样的Geometry被重复渲染了两遍,CPU-GPU的带宽加倍,而这两份Geometry大部分Shading计算(如Model Transform,Attribute计算等)是相同的,仅仅只有View矩阵存在差异。这些数据或计算上的冗余显然可以在GPU内部优化,以提高Performance

另一种方案是起Geometry Shader,在GS里边给每个View送出各自的position或attribute:

for(int view_id  =0; view_id < 2; view_id++)
{
    MVP = MVP_Matrix[view_id];
    gl_Position = MVP * in_position;
}

这样能避免CPU-GPU带宽问题,同时可以避免相同属性的重复运算,但GS的performance本身并不理想。在GS单个Shader中loop过多的顶点属性,本身会使用较多资源,进而限制Shading的并行度。

OVR_multiview扩展旨在让GPU支持更高效的Multiview rendering(最常见是2个View),启用该扩展时,GPU将在Vertex Shader(VS)中loop,使用ViewID得到per-view的属性,如position和依赖于view的normal(OVR_multiview只允许position依赖于view_ID,不过新的扩展OVR_multiview2放宽了限制,允许其他属性根据view_ID取值)。

新的函数FramebufferTextureMultiviewOVR与FramebufferTextureMultiview类似,但它会使支持该扩展的GPULoop多次。

FramebufferTextureMultiviewOVR( enum target, enum attachment, uint texture, int level, int baseViewIndex, sizei numViews );

一个简单的例子[2],在VS中,我们用modelViewProjection[gl_ViewID_OVR]获取MVP矩阵,而同样的几何体会被渲染两遍,第一次gl_ViewID_OVR=0,第二次gl_ViewID_OVR=1。

#version 300 es
#extension GL_OVR_multiview : enable
layout(num_views = 2) in;
in vec3 vertexPosition;
in vec3 vertexNormal;
uniform mat4 modelViewProjection[2];
uniform mat4 model;
out vec3 v_normal;
void main()
{
gl_Position = modelViewProjection[gl_ViewID_OVR] * vec4(vertexPosition, 1.0);
v_normal = (model * vec4(vertexNormal, 0.0f)).xyz;
}
#version 300 es
precision mediump float;
in vec3 v_normal;
out vec4 f_color;
vec3 light(vec3 n, vec3 l, vec3 c)
{
float ndotl = max(dot(n, l), 0.0);
return ndotl * c;
}
void main()
{
vec3 albedo = vec3(0.95, 0.84, 0.62);
vec3 n = normalize(v_normal);
f_color.rgb = vec3(0.0);
f_color.rgb += light(n, normalize(vec3(1.0)), vec3(1.0));
f_color.rgb += light(n, normalize(vec3(-1.0, -1.0, 0.0)), vec3(0.2, 0.23, 0.35));
f_color.a = 1.0;
}

Shader里输出各自数据给每个View,使用ViewID索引出相应的数据,渲染结果被写到2D array texture的两个slice中,在VR设备中会显示到两个屏幕上。


OVR_multiview除了用来给2只眼睛发送各自的view外,另一个可能的用途是给每只眼睛送出2笔不同分辨率的View,人眼成像通常是中心清晰而周围模糊些。因此,对于中心出给高分辨率,四周给低分辨率,这样可减少像素的渲染。

不过,OVR_multiview还是有不少的限制:
不支持transform feedback(DX的Stream output)、tessellation control or evaluation shaders以及geometry shader

2. Multi Viewport

2.1 NV_viewport_array2

Multi-viewport,即在一个Shader中把primitive同时渲染到多个Viewport上去时。Geometry Shader是最常规的选择,因为只有GS才能看到整个per-primitive的build-in属性gl_ViewportIndex。 NV_viewport_array2扩展便是为了支持比GS Loop更高效的Multi-viewport, 应用可在Vertex Shader/Control Shader/Evaluatoin Shader/Geometry Shader设置build-in属性gl_ViewportMask指定需要发送的viewport,而GPU原则上可用可编程或Fixed Function的方式,在Raster之前Loop每个有效的viewport,并把Raster结果送出。

通过viewport_relative声明,NV_viewport_array2还支持把vertex emit到不同的layer上

 layout (viewport_relative) out highp int gl_Layer;

因此,GPU内部的逻辑过程大概是这样子的:

//In a vertex shader or evaluation shader
for(int i=0; i<Viewport_Num; i++
{
  if((viewport_mask>>i)&1)
  {
     gl_layer+=(viewport_relative) ? i : 0;
  }
  
  Emit vertex;

  }
}

这个扩展被Nvidia Maxwell用于cubemap rendering的加速


2.2 NV_viewport_swizzle

在一些multi viewport的应用中(比如通过单个pass把primitive渲染到cube的6个面上),有时顶点position可能需要简单的修改,比如通过翻转,XY坐标的互换来简单调整每个面上物体的朝向。NV_viewport_swizzle支持per-viewport swizzle,应用可以通过函数设置XYZW的swizzle方式

    void ViewportSwizzleNV(uint index,
                           enum swizzlex, enum swizzley,
                           enum swizzlez, enum swizzlew)

其中swizzlex,swizzley,swizzlez,swizzlew的取值可以是

        VIEWPORT_SWIZZLE_POSITIVE_X_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_X_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_Y_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_Y_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_Z_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_Z_NV                  
        VIEWPORT_SWIZZLE_POSITIVE_W_NV                  
        VIEWPORT_SWIZZLE_NEGATIVE_W_NV                  

以swizzlex为例,对于这8中swizzle方式,GPU将对position坐标做不同的调整:

        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_X_NV) x' = x;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_X_NV) x' = -x;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_Y_NV) x' = y;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_Y_NV) x' = -y;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_Z_NV) x' = z;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_Z_NV) x' = -z;
        if (swizzlex == VIEWPORT_SWIZZLE_POSITIVE_W_NV) x' = w;
        if (swizzlex == VIEWPORT_SWIZZLE_NEGATIVE_W_NV) x' = -w;

swizzle针对的坐标是clipping space坐标,即在转化成NDC坐标之前执行swizzle。设置设置适当的swizzle,可以借助GPU直接渲染到cube map的6个面上。

一个例子:

      layout(triangles) in;
      layout(passthrough) in Inputs {
        vec2 texcoord;
        vec3 normal;
        vec4 baseColor;
      }
      layout(passthrough) in gl_PerVertex {
        vec4 gl_Position;
      } gl_in[];
      layout(viewport_relative) out int gl_Layer;

      void main()
      {
        // Figure out which faces the primitive projects onto and
        // generate a corresponding viewport mask.
        uint mask = 0;
        for (int i = 0; i < 6; i++) {
          if (!shouldCull(face)){//If primitive don't project onto this face
            mask |= 1U << i;
          }
        }
        gl_ViewportMask = mask;
        gl_Layer = 0;
      }



3. w scaling与分辨率


NV_clip_space_w_scaling

通常渲染结束后,整张图像还需要做一次后处理——Barrel distortion(桶形失真),以抵消VR设备固有的pincushion distortion(枕形失真)。而经过Barrel distortion的图像的特点边沿的分辨率较低,这意味着原始图像靠近边沿的许多像素对最终的校正图像并无贡献[3]。


NV_clip_space_w_scaling为VR应用提供w-scaling的功能,通过AP为viewport指定两个参数xcoeff和ycoeff:

void ViewportPositionWScaleNV(uint index, float xcoeff, float ycoeff);

GPU负责在Perspective division和Viewport Transform之前对w做以下scaling:

w' = xcoeff * x + ycoeff * y + w;

对于4个象限设置不同符号的xcoeff/ycoeff(需要把所有Geometry重复画到4个同样的viewport上,但每次只scissor出一个象限),使得距离中心越远则w越大,分辨率越低。

GPU只负责做w-scaling使得分辨率呈线性变化,至于un-scaling和后处理(barrel distortion)还是需要AP完成。下面的fragment shader可以包含到后处理的Shader中,负责做un-scale,然后让后处理继续做barrel distortion。

        // Vertex Shader
        // Draw a triangle that covers the whole screen
        const vec4 positions[3] = vec4[3](vec4(-1, -1, 0, 1),
                                          vec4( 3, -1, 0, 1),
                                          vec4(-1,  3, 0, 1));
        out vec2 uv;
        void main()
        {
          vec4 pos = positions[ gl_VertexID ];
          gl_Position = pos;
          uv = pos.xy;
        }

        // Fragment Shader
        uniform sampler2D tex;
        uniform float xcoeff;
        uniform float ycoeff;
        out vec4 Color;
        in vec2 uv;

        void main()
        {
          // Handle uv as if upper right quadrant
          vec2 uvabs = abs(uv);

          // unscale: transform w-scaled image into an unscaled image
          //   scale: transform unscaled image int a w-scaled image
          float unscale = 1.0 / (1 + xcoeff * uvabs.x + xcoeff * uvabs.y);
          //float scale = 1.0 / (1 - xcoeff * uvabs.x - xcoeff * uvabs.y);

          vec2 P = vec2(unscale * uvabs.x, unscale * uvabs.y);

          // Go back to the right quadrant
          P *= sign(uv);

          Color = texture(tex, P * 0.5 + 0.5);
        }

Reference

[1] Optimizing Virtual Reality: Understanding Multiview

[2] Using multiview rendering - Mali Developer Center

[3] Optimizing VR renderers with OVR_multiview - Imagination Technologies

[4] NVIDIA OpenGL in 2016

图形处理器(GPU)
14 ​1 条评论
​分享
​收藏

文章被以下专栏收录

GPU架构浅析
通过专栏与大家交流探讨GPU Pipeline相关的图形学知识,以及GPU架构问题。

推荐阅读

前端如何适配手机屏幕之viewport

前端如何适配手机屏幕之viewport

Larry 发表于互联网笔记

响应式网页开发基础:DPR 与 viewport

响应式设计与开发中,有两个重要的概念,一直会贯穿整个流程,但是又有很多人搞不清楚。它们就是 DPR 与 viewport,下面让我们看看这两个概念。什么是 DPR?我们知道在 Chrome 浏览器控制台…

tedlife

响应式网页开发基础:DPR 与 viewport

响应式设计与开发中,有两个重要的概念,一直会贯穿整个流程,但又有很多人搞不清楚。它们就是 DPR 与 viewport,下面让我们看看这两个概念。什么是 DPR?我们知道在 Chrome 浏览器控制台 c…

优达学城(... 发表于Udaci...
前端每周清单第 31 期: iOS 11 Viewport 解析,Preact PWA 性能优化案例,JS 内存泄露分析

前端每周清单第 31 期: iOS 11 Viewport 解析,Preact PWA 性能优化案例,JS 内存泄露分析

王下邀月熊 发表于前端之巅

1 条评论

​切换为时间排序
写下你的评论...
评论
安迪的夏 11 个月前
去年帕斯卡发布会上,有一个VRworks方面的新特性Single Pass Stereo,基于多重同步投影技术,单次渲染再投射以实现左右的view
不过目前除了fun house似乎还没有什么实际应用...
多重同步投影的应用很宽泛,最直接的便是能解决三联屏这样的环绕透视的扭曲,其实哪怕16:9单屏都存在边缘扭曲的现象,不过这个技术的实现依赖于游戏开发者的附加,除了ansel以外其他诸多新技术都不是驱动层可调用的.
赞回复踩举报
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

立体渲染(Stereo Rendering) 的相关文章

  • unity开发VR的项目01——环境配置(unity2020.3)

    使用unity创建一个steam VR项目 首先要进行环境的配置 一 Steam VR插件导入 创建一个unity 3 项目 在 商店 window asset store 中搜索SteamVR Plugin 找到并导入到unity资源 也
  • Unity中如何让物体和相机一起动

    Unity中开发VR或者AR应用中我们想要物体和相机跟随着进行移动 我们需要先获得相机的参数 其次我们需要修改物体的参数使得其跟随移动 public class TestCubeStability MonoBehaviour public
  • FBXSDK2018 plugin for Unity

    1 下载FBXSDK 点击打开链接 2 安装SDK 记住你所安装的目录 3 visualstudio 新建 C 空项目 首先配置 C C 附加包含目录 你安装sdk 路径下的include 4 设置预处理器 假设是Debug x64 WIN
  • Threejs + vue 学习- VR 看房

    知识点 参考链接 threejs github 图片下载 https gitee com congyingcy threejs learning tree master three public imgs 直接跳转 代码下载 直接跳转 立方
  • VR开发——Unity中导入常用的VR开发插件及简单使用

    VR开发 Unity中导入VIVE的VR开发插件及简单使用 V客学院 今天我们来讲解如何进行简单的htc vive设备的软体开发 今天的教程主要讲解从插件的导入到基本的设置以及场景搭建 小白向 首先 我们需要进入Unity中的AssetsS
  • 调用关卡蓝图上的接口函数

    本片博客实现的是不同蓝图之间用接口实现通信 下面用附上新建蓝图接口的大体步骤和实现的蓝图逻辑 新建蓝图接口 在蓝图接口里面新建函数 在关卡蓝图里面实现函数 如下图所示 然后在控件蓝图里面调用该接口 具体实现如下图
  • DllNotFoundException: XRSDKOpenVR Unity.XR.OpenVR.OpenVRLoader.Initialize报错(unity2019.4.8f1)

    打开packageManager检查是否有OpenXR Plugin插件 Remove即可 其他配置 注意版本为Unity2019 4 8f1 使用设备为Htc vive focus 3串流PC Steam VR
  • 20230322 元宇宙

    VR AR MR XR的区别和联系 知乎
  • UnityVR--小程序6--主角管理

    之前在VR场景中的主角OVRPlayerController 没有加入生命力 初始位置等关于游戏的信息 在本文中 我们将给主角增加 1 生命值 生命值增加到一定分值后 允许进入下一关卡 另一场景 生命值将为0后 场景将重新别加载 游戏将重新
  • HTCvive官方开发插件介绍

    相信各位小伙伴们在使用SteamVR Unity Plugin的过程中应该都遇到过这样的问题 获取设备很麻烦 设备在重启后indexID会改变从而导致设置好的左右手设备出现交错 无法与UGUI的事件系统连接导致无法使用UGUI等等很多问题
  • UnityVR--小程序8--激光门伤害

    本文使用Line Renderer组件 在门框中画出一道激光线 被线照射到的主角将会扣分 另外 激光仅检测ragCast层 所以主角必须添加到ragCast层中 与坦克对战小程序 UnityVR 小程序7 坦克对战 的设置相同 1 在场景中
  • Unity3D如何开发最简单的VR游戏 vrPlus(神之眼)

    VR是一种可创建和体验虚拟世界 Virtual World 的计算机系统 是一种可以创建和体验虚拟世界的计算机仿真系统 它利用计算机生成一种模拟环境 是一种多源信息融合的交互式三维动态视景和实体行为的系统仿真使用户沉浸到该环境中 作为一个u
  • Unity3D-VR《静夜诗》3-开始按钮与开始文本信息

    Unity3D VR 静夜诗 3 开始按钮与开始文本信息 1 开始按钮及开始信息文本UI对象的设计 1 1容器对象PanelBeginUI 1 2开始信息文本TextBegin 1 3开始按钮BtnBegin 2 开始按钮实现凝视触发 凝视
  • unity添加多个相机渲染物体多个视角的图片

    添加相机 我渲染物体多视角的图片是要用到cave空间 所以添加了四个相机 并且都放在空物体下面 还有两个物体 用在cave空间要保证四个相机的位置一致 rotation互成90 前 0 0 0 右 0 90 0 左 0 270 0 下 90
  • 用VRTK4.0如何实现与UI交互(保姆级别教程)

    1 导入Tilia UnityUI master包 点击下面的链接直接跳到这个界面studentutu Tilia UnityUI Tilia package for VRTK 4 featuring support for Unity U
  • 8 种流行的计算机视觉应用

    计算机视觉是人工智能的一部分 它使计算机能够从计算机化的图片 视频中获取重要数据 并根据这些数据提出建议 简单地说 你可以理解 如果人工智能允许计算机思考 那么计算机视觉就会鼓励它们去看 注意到和理解 这是在深度学习和机器学习的帮助下完成的
  • UE4 VR WidgetInteraction 局域网设定

    无论用什么 我们要先确定是什么 鲁迅 下面是关于WidgetInteraction的官方定义 控件交互组件执行光线投射 确定它是否命中世界场景中的控件组件 如命中 可设置规则确定与其交互的方式 交互通过模拟定义的按键来执行 例如一个按钮可通
  • HTC-VIVE手柄使用代码

    using UnityEngine using System Collections 检测手柄功能的脚本 这个脚本挂到手柄上 controler right 和controler left 上 public class ButtonTouc
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙

随机推荐

  • Python数据分析实战(2)使用Pandas进行数据分析

    文章目录 一 Pandas的使用 1 Pandas介绍 2 Pandas基本操作 Series的操作 创建DataFrame 常见列操作 常见行操作 DateFrame的基本操作 时间操作 3 Pandas进行数据分析 读取数据 选择数据子
  • 阿里云oss图片缩放

    您可以通过文件URL SDK API方式设置参数 处理图片 本文以文件URL为例进行介绍 关于如何使用SDK和REST API处理图片 请参见图片处理操作方式 本文示例使用的Bucket为杭州地域名为oss console img demo
  • 申请堆区空间

    malloc void malloc size t size 功能 申请 size 个字节的堆区空间 返回值 成功返回堆区空间首地址 失败返回 NULL free void free void ptr 功能 释放堆区空间 memset 对空
  • IPSec 专栏目录锦集(openswan)

    为了方便查阅现有的文章 特准备一个目录页供后续查询使用 专栏序言 1 IPsec理论知识 openswan任务调度基础知识之信号 IPSec协议详细介绍 pdf 一本书 IPSec技术理论介绍 pdf IBM手册 包括IKE协商commit
  • 图像型火灾探测系统

    图像型火灾探测系统是基于视频图像处理 人工智能处理分析 物联网通讯 大数据平台等先进技术实现的可视化早期 火灾探测报警系统 可探测物质燃烧产生的烟雾 火焰 温度等光谱特性 系统主要由图像型火焰火灾探测器 图像型线型 光束感烟火灾探测器 图像
  • hive 调优记录

    数据倾斜总结 在做Shuffle阶段的优化过程中 遇到了数据倾斜的问题 造成了对一些情况下优化效果不明显 主要是因为在Job完成后的所得到的Counters是整个Job的总和 优化是基于这些Counters得出的平均值 而由于数据倾斜的原因
  • Centos7配置samba

    Centos7 配置 SAMBA Centos7 配置 SAMBA步骤 一 关闭selinux和firewall 关闭selinx SELINUX enforcing 改为 SELINUX disabled 关闭firewall syste
  • msvcp140.dll是什么东西,msvcp140.dll丢失的修复方案

    在我们打开游戏或者软件的时候 电脑提示由于找不到msvcp140 dll 无法继续执行此代码 重新安装程序可能会解决问题 那么msvcp140 dll是什么东西 msvcp140 dll丢失有什么修复方案 msvcp140 dll是什么东西
  • 微信小程序 如何把小程序页面保存至用户相册

    思路 canvas绘制出页面 将canvas转化成图片 获取到临时路径 用临时路径将图片保存至相册 组件及API canvas 画布 官方文档链接 wx canvasToTempFilePath 将canvas转换为临时文件路径 官方文档链
  • 用C语言实现贪吃蛇(基于Linux系统 ubuntu 环境,调用curses库实现)

    前言 这是一个基于C语言链表开发的贪吃蛇游戏 其实贪吃蛇游戏要解决的主要问题就是 1 这个游戏的基本组成元素和数据结构 2 如何初始化贪吃蛇并正常行走 如何判断事件发生 游戏说明 按方向键上下左右 可以实现蛇移动方向的改变 超出边界或者蛇头
  • 实现文件秒传

    实现文件秒传 文件的校验值计算 校验算法类型 校验码长度 1 CRC 4 8字节 计算效率高但安全性较低 传输数据的校验 2 MD5 16个字节 中等 文件校验和数据签名 3 SHA1 20个字节 安全性高 文件校验和数据签名 秒传原理 场
  • PCL 半径滤波器——高级用法

    目录 一 概述 1 不足 2 改进 二 代码实现 三 结果展示 一 概述 1 不足 传统半径滤波的算法原理及使用方法见 PCL 半径滤波器 传统方法有一个弊端就是会损失点云的一些信息 如原始点云数据中包含回波次数 扫描时间 扫描角度等属性信
  • Spring 使用指南 ~ 1、Spring 的 IOC 和 DI 简介

    一 IOC DI 1 概念介绍 IOC 控制反转 即把类的实例化交给 Spring 来管理 DI 依赖注入 即通过 Spring 为应用中被 Spring 管理的类实例注入其依赖的实例和其他信息 2 使用 XML 形式 1 构造函数注入 p
  • ReactiveUI MVVM框架(1)-Collections

    ReactiveUI MVVM框架 1 Collections ReactiveUI使用动态数据 DynamicData 用于集合的操作 当对动态数据集合进行更改时 会产生更改通知 通知表示为ChangeSet 里面包含了更改信息 多个更改
  • QML的语法——样式表QSS

    一 QSS介绍 如果学过前端的话 QSS Qt style sheet 就很好理解了 QSS 是一个非常强大的用于自定义控件外观的机制 它的概念 术语以及语法都是受到了 HTML CSS 的启发 QSS是用来设置界面样式的 设置的方法就是类
  • Excel修改日期格式,改变日期的筛选方式

    我们有两列日期数据 左边这一列筛选会显示 右边这一列筛选会显示 修改格式 将 日期1 改为 日期2 将 日期1 的格式修改为文本格式即可 修改格式 将 日期2 改为 日期1 选中日期2 点击 数据 gt 分列 然后什么都不用操作直接点击完成
  • Unity单元测试笔记

    Unity单元测试 在项目中安装NUnit 在unity面板中打开单元测试面板 在项目中安装NUnit 比如对测试用例代码中对缺乏引用的SetUp字段 按下快捷键Alt Enter 选择安装最新版本的NUnit using UnityEng
  • 11010序列检测器Verilog代码及仿真测试文件

    1 11010序列检测器 状态转移图 2 Verilog代码 module fsm x z clk rst data input clk rst x input 20 0 data output reg z reg 2 0 state ns
  • 作为程序员,赚取额外收入的 4个简单副业!

    对于程序员来说 可不是只有赚死工资这一条道路 好学编程给大家总结一下有哪些兼职渠道 以供大家参考 1 知识变现 一些问答平台比如微博 知乎 悟空问答 芝麻问答 饭团 知识星球 付费QQ群 付费社群等等 我们都可以挑选自己专业领域的问题选择回
  • 立体渲染(Stereo Rendering)

    首发于 GPU架构浅析 写文章 Multi View与Multi Viewport xiaocai Junio