照片:批渲染:应该转变发生在CPU或GPU?

0

的问题

我正在开发一个2D游戏引擎,将支持3D的未来。 在当前这个发展阶段,我正在批呈现。 为一些你可能知道,在分批处理的图形合在一起,统一支持的颜色(RGBA)、纹理坐标纹理ID(纹理指数),以及模型转换矩阵出去窗口,而是通过顶点缓冲区。 现在,我已经实施了通过模型的职位的、颜色、质地坐标,并纹理ID到顶点缓冲区。 我的顶点缓冲区的格式是这样现在:

float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};

我要把计算,其目的应该是在世界空间,使用转换矩阵。 这导致我提出这样的问题:

应该转换矩阵可乘以在模型的顶点位置上的处理器或GPU?

东西要记住的是,如果我通过它的顶点缓冲,我已经上传的转换矩阵一旦每顶点(4次每sprite)这对我来说似乎是一个废物的存储器。 另一方面,乘以型的顶点位置的转换矩阵的CPU似乎喜欢它会慢与GPU的并发能力。

这是我的顶点缓冲区的格式会是什么样子,如果我的计算改变的GPU:

float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};

问题主要是理论上的驱动。 因此,理论和技术的答案,将不胜感激。 但作为参考,这里的代码。

c++ glm-math glsl opengl
2021-11-24 03:43:20
2

最好的答案

1

应该转变发生在CPU或GPU?

这真的取决于有关情况。 如果你重新提交你的顶点的每一个框架,它是最佳的基准是什么最适合你的情况。 如果你想要动没有重新提交所有顶点,你没有选择,只能适用于GPU。

无论原因如何,如果决定适用的变革对GPU,有更好的方式这样做的其他复制的矩阵,为各顶点。 我而不是投入转换矩阵中的一个 SSBO:

layout(std430, binding=0) buffer Models {
    mat4 MV[]; // model-view matrices
};

和储存的一个单一的指数,在每个顶点在维罗:

struct Vert {
    float x, y, r, g, b, a, u, v;
    int textureID, model;
};

顶点色器可以去获取全矩阵的基础上的指数属性:

layout(location = 0) in vec4 in_pos;
layout(location = 1) in int in_model;
void main() {
    gl_Position = MV[in_model] * in_pos;
}

你甚至可以将它与其他每目的属性,就像 textureID.

编辑: 你可以实现类似的东西与实例和多画. 虽然它很可能是速度较慢。

2021-11-24 17:20:51

你可以拟订更多的究竟是什么模式? 我在努力执行它,我只有一个精灵在屏幕上,并认为它是因为我不会发送正确的信息。
Christopher Barrios Agosto

@ChristopherBarriosAgosto一个指标模型的矩阵在MV阵列:0,1,2...等等
Yakov Galka

因为你呈现独特的转变圣城,那将是 0,0,0,0,1,1,1,1,2,2,2,2,... 如果您呈现 glDrawElements.
Yakov Galka

我想通了! 一切正常! 原来我是通过和解释指数的权利,但我穿的指数作为一种浮到GLSL时它期待一个int. 我收到一个浮起,并在GLSL转换为一个int而不是解释所有指数的权利。 我必须这样做,因为顶点缓冲区的浮动类型。 谢谢你的一切!
Christopher Barrios Agosto

@ChristopherBarriosAgosto:祝贺你想出它。'顶点缓冲区的浮动类型--顶点缓冲区的序列字节。 你可以储存 structs 在那里,一些 int 领域和一些 float 领域。
Yakov Galka
0

我不知道该怎么你的引擎的代码实际上看起来像,但我认为它看起来像任何其他的照片的程序。

如果是这样,在我的经验,改变矩阵应当通常被传递到顶点着色和应用与给予折点的信息GPU当你画现场。 例如:

//MVP matrix
GLuint MatrixID = glGetUniformLocation(shaderProgID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

但如果你想要找的世界坐标作为所有的顶点对于一个特定的群体,外部呈现的功能,则可能需要做CPU,或者你会需要使用一些并行编程技术,诸如usb类做的工作GPU。

最重要的是,为什么具体做你想做的世界坐标的信息之外绘图程序? 如果你只是想找到模型的世界坐标,可以简单地设置一个中心协调每个模型的你已经在现场,只有跟踪那个单一的协调,而不是整个网状组。

顶点的信息应该总是可以在模型的坐标和存储在顶点缓冲区没有触,除非你想要应用一些修改。

2021-11-24 03:57:24

我多分批处理的图形在一起。 因此,我无法使用的校服,通过图形'转变,因为我不能改变的统一的变换之间绘制的呼吁。 然而,我相信使用SSBOs是一个非常好的选择。
Christopher Barrios Agosto

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................