You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL+C加载PPM格式精灵失败,屏幕仅显示空白求助

问题排查与修复

核心错误:循环条件写错

你的drawSprites函数内层循环的终止条件误用了y<33,这会导致内层循环要么无限执行(当前外层循环的y值固定且小于33时,x会一直递增),要么完全不执行,最终没有任何像素被绘制。

将内层循环条件改为x<33:

for(x=0; x<33; x++){//The image is 33*33

其他优化与注意事项

  1. 减少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();
    }
    
  2. 调整坐标显示位置
    你的正交投影设置为gluOrtho2D(0,width,height,0),y轴原点在屏幕底部,y值越大越靠近屏幕顶部。当前代码中y+8的范围是8到40,对应屏幕底部区域,可能无法直观看到。若要将精灵移至屏幕上方,可修改顶点y坐标:

    glVertex2i(x+8, height - (y+8));
    
  3. 验证数组完整性
    确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:39:15