gpt4 book ai didi

c - 辅助线程中的 Opengl 渲染(纹理)

转载 作者:行者123 更新时间:2023-11-30 17:26:45 26 4
gpt4 key购买 nike

我希望使用 pthread 库渲染纹理。这是我希望通过更新纹理的线程渲染的函数。最初,我的纹理是通过 init 函数加载并由显示函数渲染的(两者都在主线程中)。

void *moveMap(void *x)
{
printf("move called\n");
tim.tv_sec = 0;
tim.tv_nsec = 500000000;
glBindTexture(GL_TEXTURE_2D, texName[0]);

int index;
for(index=pathLength;index>=0;index--)
{
printf("Go %d %d\n", Path[index][0], Path[index][1]);
glTexSubImage2D(GL_TEXTURE_2D, 0, Path[index][0]*20, Path[index][1]*20, surface->w, surface->h, GL_RGB,GL_UNSIGNED_BYTE, surface->pixels);
display();
}
}

void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
pressedXCoord=x/20;
pressedYCoord=y/20;
printf("Pressed on %d %d\n",x/20,y/20);
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
releasedXCoord=x/20;
releasedYCoord=y/20;
printf("Released on %d %d\n",x/20,y/20);
findPath(pressedXCoord,pressedYCoord,releasedXCoord,releasedYCoord);
if(pthread_create(&inc_x_thread, NULL, moveMap, NULL)) {
fprintf(stderr, "Error creating thread\n");
return 1;
}
}
}

findpath 函数基本上计算两个坐标之间的最短路径,函数 moveMap 通过该路径更新纹理。当我调用 moveMap 函数时,没有线程纹理会根据需要更新,但当通过线程调用时则不会。

最佳答案

OpenGL 不能很好地处理多线程,它期望所有调用都来自单个线程。

您可以使用 glutIdleFunc让它一次复制一点:

void idleCopy(void){
if(copyIndex==0)return;

printf("Go %d %d\n", Path[copyIndex][0], Path[copyIndex][1]);
glTexSubImage2D(GL_TEXTURE_2D, 0, Path[copyIndex][0]*20, Path[copyIndex][1]*20, surface->w, surface->h, GL_RGB,GL_UNSIGNED_BYTE, surface->pixels);
glutPostRedisplay();
copyIndex--;
if(copyIndex==0)glutIdleFunc(null);//disable callback

}

在 mouse() 中:

if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
releasedXCoord=x/20;
releasedYCoord=y/20;
printf("Released on %d %d\n",x/20,y/20);
findPath(pressedXCoord,pressedYCoord,releasedXCoord,releasedYCoord);
glutIdleFunc(&idleCopy);
}

关于c - 辅助线程中的 Opengl 渲染(纹理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659095/

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