OpenGL+C加载PPM格式精灵失败,屏幕仅显示空白求助
问题排查与修复
核心错误:循环条件写错
你的drawSprites函数内层循环的终止条件误用了y<33,这会导致内层循环要么无限执行(当前外层循环的y值固定且小于33时,x会一直递增),要么完全不执行,最终没有任何像素被绘制。
将内层循环条件改为x<33:
for(x=0; x<33; x++){//The image is 33*33
其他优化与注意事项
减少OpenGL状态切换开销
把glPointSize、glBegin和glEnd移到循环外,避免重复触发状态切换,提升绘制效率:void drawSprites(){ int x; int y; glPointSize(8); glBegin(GL_POINTS); for(y=0;y<33;y++){//The image is 33*33 for(x=0;x<33;x++){//The image is 33*33 int pixel=(y*33+x)*3;//Use the *3 because there are three RGB vals per pixel int red=Wall[pixel+0]; int green=Wall[pixel+1]; int blue=Wall[pixel+2]; glColor3ub(red, green, blue); glVertex2i(x+8,y+8); } } glEnd(); }调整坐标显示位置
你的正交投影设置为gluOrtho2D(0,width,height,0),y轴原点在屏幕底部,y值越大越靠近屏幕顶部。当前代码中y+8的范围是8到40,对应屏幕底部区域,可能无法直观看到。若要将精灵移至屏幕上方,可修改顶点y坐标:glVertex2i(x+8, height - (y+8));验证数组完整性
确保Wall数组的元素数量为33*33*3=3267个,避免数组越界访问引发的未定义行为。
修改后的关键代码片段
void drawSprites(){ int x; int y; glPointSize(8); glBegin(GL_POINTS); for(y=0;y<33;y++){//The image is 33*33 for(x=0;x<33;x++){//The image is 33*33 int pixel=(y*33+x)*3;//Use the *3 because there are three RGB vals per pixel int red=Wall[pixel+0]; int green=Wall[pixel+1]; int blue=Wall[pixel+2]; glColor3ub(red, green, blue); // 调整y坐标至屏幕上方区域 glVertex2i(x+8, height - (y+8)); } } glEnd(); }
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

