gpt4 book ai didi

c++ - 高效绘制动态对象

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:38 25 4
gpt4 key购买 nike

在 OpenGL 上绘制动态移动对象的最佳方法是什么?

目前,我正在这样做:我有一个 Actor 类,我在其中生成一个缓冲区的构造函数:

Actor::Actor(float x, float y): xpos(x),
ypos(y),
width(1),
height(1) {
glGenBuffers(1, &buffer);
}

所有其他处理都在每一帧中完成:

for(auto const &a: actors) {

float x = (a.xpos / tiles_x) * 2 - 1.0f + (1 / tiles_x);
float y = -((a.ypos / tiles_y) * 2 - 1.0f + (1 / tiles_y));
float w = a.width / (tiles_x);
float h = a.height / (tiles_y);

const GLfloat vertex[] {
x - w, y - h, 1.0f,
x - w, y + h, 1.0f,
x + w, y + h, 1.0f,
x - w, y - h, 1.0f,
x + w, y - h, 1.0f,
x + w, y + h, 1.0f,

};

glBindBuffer(GL_ARRAY_BUFFER, a.buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0);

glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
}

我不是 OpenGL 专家,但在我看来它效率很低。难道没有另一种更有效的方法吗?

最佳答案

不推荐使用的方法是使用 glTransform。更好的方法是使用着色器。

您真的不需要每帧都将所有顶点发送到 GPU。您认为它效率低下的假设是正确的。当你创建你的 Actor 时,你创建一次网格并将所有顶点发送到图形卡。然后每个绘制帧,您所要做的就是绑定(bind)缓冲区并调用 glDrawArrays。 Something like this.

要应用变换,您将 x、y、z 偏移量发送到顶点着色器并将其与顶点相乘。 This site offers一些关于如何使用未弃用的 opengl 功能执行此操作的优秀教程。

关于c++ - 高效绘制动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com