【问题标题】:OpenGL ES 2.0, best practice to do transformationsOpenGL ES 2.0,进行转换的最佳实践
【发布时间】:2012-07-10 06:19:10
【问题描述】:

我正在编写我自己的带有 OpenGL ES 2.0 的 Android 图形引擎。

在管理具有多个对象网格的整个场景后,我正在尝试实现阴影体积。

逻辑是(简化的):首先,我从二进制文件创建一个对象(包含顶点、面、边和所有数据)。之后,我创建一个顶点缓冲区并绘制元素。

到目前为止,我在模型矩阵(glRotate 等)上使用了带有 OpenGL 函数的变换(缩放、平移、旋转)。

但是为了使用Shadow Volume,我必须在每次变换物体或灯光时计算出哪些面在灯光和轮廓前面。所以我在我的顶点数组上使用了一个循环。

我的问题是:在哪里进行转换?我是否必须在每次更改时转换顶点数组并将其重新加载到顶点缓冲区中?

按照这个,这是一件坏事:Android opengl modify vertex array after draw call

那么,最佳做法是什么?

对不起,我的英语很差,提前谢谢你;)

【问题讨论】:

    标签: android opengl-es-2.0


    【解决方案1】:

    我只记得粗略的阴影体积,但如果我没记错那么你首先确定光前的脸,这些脸的边界是跨越体积的轮廓,对吧?

    所以你想对每个顶点法线 n 和光向量 l 做这样的事情:

    前 = (l 点 M * n)

    其中 M 是顶点变换矩阵的逆转置。

    除了将每个法线与 n 相乘之外,您不能为光矢量计算适当的变换吗...即矩阵 Ml:

    (Ml * l 点 n) = (l 点 M * n)

    那是我的想法。

    【讨论】:

    • 谢谢你。是的,在光前有一个(或多个)邻居在光后的每个面都是剪影的一部分。我知道如何处理Shadow Volume。我的问题是关于在哪里对我的对象进行转换(缩放、平移、旋转)?因为我必须在每个变换(物体或灯光)上重新计算阴影体积的面。如果我转换我的顶点数组,我每次都需要在顶点缓冲区中重新加载它,它会降低性能......
    • 我仍然不确定我是否理解您的问题...您的对象或灯光已通过仿射变换进行变换,因此您必须重新计算阴影体积,对吗? ...对于你需要计算当前轮廓的体积,你必须确定在灯光前的脸,对吧? ...问题是,如果发生这种情况,您不想转换每个顶点,因为它的成本很高,对吧?
    • 对不起,这是我的错,而且我的英语很差。不,我谈论阴影体积只是为了解释为什么我需要对顶点数组进行转换。现在(在实现阴影之前),我从顶点数组加载顶点缓冲区,并使用 OpenGL 函数(gltranslate、grotate...)在模型矩阵上按矩阵进行平移、缩放、旋转。但是就像我需要先转换我的顶点数组(对于阴影),如何处理顶点缓冲区?每次都需要重新加载吗?这对性能来说不是一件好事。。你明白吗?
    • 我的建议是,不要转换网格(您必须为每个顶点应用矩阵),您可以找到光源的转换,以便光源和网格之间的相对位置与变换网格时相同,但您只需应用一次矩阵(用于灯光)。
    • 这样你就可以在没有每个顶点的矩阵乘法的情况下获得在灯光前面的面。然后对于找到的面,您可以计算边界/轮廓并仅使用初始网格变换来变换轮廓,以获得正确坐标系中的结果。有点复杂。我希望你能明白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2021-01-18
    相关资源
    最近更新 更多