着色器中的MVP矩阵乘法与否

Posted

技术标签:

【中文标题】着色器中的MVP矩阵乘法与否【英文标题】:MVP matrix multiplication in shader or not 【发布时间】:2013-09-12 15:43:39 【问题描述】:

假设我有一艘星际飞船,其代码中的坐标如下

public float coords[] = 
        -0.025f,   -0.04f, -0.1f,   
        0.025f,   -0.04f, -0.1f,  
        -0.025f,   0.04f, -0.1f, 
    ;

我需要检查与流星的碰撞。 所以星舰有三角形边界框,流星有方形边界框。 因此,每当我平移或旋转我的星舰时,我都会使用 MVP 矩阵并将其与垂直着色器中的每个垂直相乘。但是我的边界框也应该移动和旋转。 我该怎么做?我应该在顶点着色器之外将 MVP 矩阵乘以星舰坐标和边界框坐标,然后从顶点着色器中删除 MVP 矩阵吗?或者还有其他方法可以在平移和移动我的真实对象的同时移动和平移边界框?

【问题讨论】:

【参考方案1】:

我们需要分离两件事:碰撞检测和渲染。

当您渲染模型时,您通常有一些 VertexBuffer(数据存储在对象空间中),并在着色器中通过 ModelViewMatrix 对其进行转换。仅仅为了改变模型的位置而修改 VertexBuffer 中的数据是相当昂贵的。

另一方面,当您检查碰撞时,您不是在着色器中而是在某些物理引擎中进行检查。例如,您可以在 CPU 端执行此操作。通常,您通过 MVP 转换边界框,然后执行碰撞测试。请注意,MVP 转换边界框应该非常快(立方体的几个顶点,或者四边形与对象本身的数百个顶点)。

同步这些数据很重要(如您所见)。

一些代码:

update() 
    foreach o in objects
        o.calculateModelViewBoundingBox()

    testCollisionBetweenObjects()


render()  
    foreach o in objects
        o.render()

【讨论】:

以上是关于着色器中的MVP矩阵乘法与否的主要内容,如果未能解决你的问题,请参考以下文章

Apple Metal元素矩阵乘法(Hadamard产品)

OpenGL矩阵乘法C++

Spark中的矩阵乘法分析

缓存友好的优化:面向对象的矩阵乘法和函数内平铺矩阵乘法

Spark中的矩阵乘法源码分析

Spark中的矩阵乘法源码分析