gpt4 book ai didi

c++ - 如何在没有高 CPU 使用率的情况下在 OpenGL 游戏中正确渲染模型(带纹理的网格)?

转载 作者:行者123 更新时间:2023-11-30 03:32:21 27 4
gpt4 key购买 nike

我有一个模型游戏,当我渲染它们时,我的 CPU 使用率很高(每个模型大约 10%)。我使用 glutMainLoop,它每秒调用 DisplayFunc 60 次。我在那里调用绘图函数

  • glPushMatrix
  • glTranslatef、glRotatef、glScalef
  • glMaterialfv 所以纹理 Material ,我绑定(bind)我的纹理
  • 三角形的 glBegin
  • 然后在循环中为面 glNormal3f、glTexCoord2f、glVertex3f 为三角形
  • glEnd
  • 和glPopMatrix

我不知道自己做错了什么,也没有立足点,所以才来这里问。

好的,所以我做了简单的修正,现在可以了吗?

    #include <GL/glut.h>
#include <gl/glext.h>

void Display();
void Reshape(int width, int height);

const int windowWidth = 480;
const int windowHeight = 270;

GLuint vertexbuffer;
static const GLfloat g_vertex_buffer_data[] =
{
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("Modern OpenGL");

glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(Display);

GLfloat reset_ambient[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, reset_ambient);
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHT0);

glGenBuffers(1, &vertexbuffer);

glutMainLoop();

return 0;
}

void Display()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAt(0,0,10,0,0,0,0,1,0);

GLfloat light0amb[4] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light0amb);
GLfloat light0dif[4] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0dif);
GLfloat light0spe[4] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_SPECULAR, light0spe);
GLfloat light0pos[4] = { 0.0, 0.0, 0.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light0pos);

glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)0
);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);

glFlush();
glutSwapBuffers();
}

void Reshape(int width, int height)
{
glutReshapeWindow(windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, width, height);
gluPerspective(45.0f, width / (double)height, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
}

最佳答案

VTT 的评论回复:glBegin/glEnd 是正确答案。稍微扩展一下,通过使用旧的、已弃用的 API,您会遇到一个确定的问题和一个潜在的问题。

明确的问题是 OpenGL 无法利用现代 GPU 中的许多硬件加速功能,因为与其将所有三角形(即顶点)和 Material (例如纹理)存储在 GPU 内存中,它可能需要每次渲染东西时,至少将其中一些从主内存复制到 GPU 内存。通过使用顶点缓冲区以及顶点着色器和片段着色器,您可以轻松避免这种开销。

如果您搜索它们,那里有很多示例,因此虽然重构代码可能需要一些时间,但知道如何去做应该不是问题。

潜在的问题是固定功能管道已被弃用一段时间(并且非正式地不鼓励使用更长时间),因此许多驱动程序可能包含该功能更多是为了与旧游戏和应用程序兼容,而不是作为优化的主动目标。换句话说,开发人员的时间花在优化现代 API 而不是 1990 年代后期的 API 上。

您最终按照自己的方式编写代码可能不是您的错。不幸的是,网络和免费提供的旧书拷贝提供了许多基于旧的固定功能管道而不是现代可编程管道的示例。结合(最初)固定功能管道通常更容易理解和使用这一事实,它会导致像您所处的情况。但是花时间学习现代 API 是非常值得的。它在您可以使用的效果方面提供了大量机会,使您的图形即使在“低端”系统上也能大放异彩。

关于c++ - 如何在没有高 CPU 使用率的情况下在 OpenGL 游戏中正确渲染模型(带纹理的网格)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504615/

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