C++ C++;OpenGL绘制像素

C++ C++;OpenGL绘制像素,c++,opengl,glut,C++,Opengl,Glut,我正在通过在线课程学习如何使用OpenGL,实践问题要求创建一个绘制像素的函数: void SetPixel(int x, int y, char r, char g, char b){} 我知道我可以这样画一幅: glBegin(GL_POINTS); glColor3f(1.0,1.0,1.0); glVertex2i(100,100); glEnd(); 然而,考虑到问题的背景,这不是一个有效的解决方案 这个问题还要求使用SetPixel函数,通过在循环中调用它来在屏幕上随

我正在通过在线课程学习如何使用OpenGL,实践问题要求创建一个绘制像素的函数:

void SetPixel(int x, int y, char r, char g, char b){}
我知道我可以这样画一幅:

glBegin(GL_POINTS);
   glColor3f(1.0,1.0,1.0);
   glVertex2i(100,100);
glEnd();

然而,考虑到问题的背景,这不是一个有效的解决方案

这个问题还要求使用SetPixel函数,通过在循环中调用它来在屏幕上随机放置像素。我知道如何实现这一点,但这是我不了解的实际像素的绘制,特别是在给定程序的上下文中

程序(使用GLUT):

#包含//-用于退出()
#包括/-for sprintf()
#包含//-用于memset()
#ifdef_WIN32
#包括“libs/glut.h”
#包括
#pragma注释(lib,“winmm.lib”)/-不是必需的,但无论如何都要包含它
#pragma注释(lib,“libs/glut32.lib”)
#埃利夫苹果__
#包括
#伊里夫
#包括
#恩迪夫
#定义帧宽1000
#定义帧_高600
//======结构和类型定义=========
typedef无符号字符字节;
结构点2d{intx,y;};
//=======全局变量==========
字节pFrameL[帧宽*帧高*3];
字节pFrameR[帧宽*帧高*3];
int shade=0;
POINT2D xypos={0,0};
int立体声=0;
int眼=10;
//======转发声明========
void();
空抽框();
无效隔行扫描(字节*pL,字节*pR);
void BuildFrame(字节*pFrame,int视图);
void OnIdle(void);
void OnDisplay(void);
空洞重塑(int w,int h);
////////////////////////////////////////////////////////
//程序输入点
////////////////////////////////////////////////////////
int main(int argc,字符**argv)
{
//--设置过剩--
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//GLUT_3_2_CORE_配置文件|
GLUTINITWindowsSize(框宽,框高);
位置(100100);
glutCreateWindow(argv[0]);
//---设置openGL状态--
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GLU平面);
glPixelStorei(GLU解包对齐,1);
//--寄存器回调函数--
glutIdleFunc(OnIdle);
glutDisplayFunc(OnDisplay);
GLUTREFORUNC(重塑);
//--运行程序
glutMainLoop();
返回0;
}
////////////////////////////////////////////////////////
//事件处理者
////////////////////////////////////////////////////////
void OnIdle(void)
{
牵引架();
再发现();
}
void OnDisplay(void)
{
glClear(GLU颜色缓冲位);
glRasterPos2i(0,0);
GLDRAW像素(帧宽、帧高、GLRGB、GLU无符号字节、(GLubyte*)pFrameR);
glutSwapBuffers();
glFlush();
}
空洞重塑(整数w,整数h)
{
GLVIEW(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
////////////////////////////////////////////////////////
//效用函数
////////////////////////////////////////////////////////
void ClearScreen()
{
memset(pFrameL,0,帧宽*帧高*3);
memset(pFrameR,0,帧宽*帧高*3);
}
无效隔行扫描(字节*pL,字节*pR)
{
int rowlen=3*帧宽;
对于(int y=0;y

有人能帮我解决这个问题吗?如何优雅地实现SetPixel功能?

根据像素格式的配置,
(x,y)
处像素的红色部分位于索引
3*(y*宽度+x)
,绿色/蓝色为+1/2:

void SetPixel(int x, int y, char r, char g, char b)
{
   if (x < 0 || x >= FRAME_WIDE || y < 0 || y >= FRAME_HIGH)
       return; // out of bounds
   int index = 3 * (y * FRAME_WIDE + x);
   pFrame[index] = r;
   pFrame[index+1] = g;
   pFrame[index+2] = b;
}
void SetPixel(int x,int y,char r,char g,char b)
{
如果(x<0 | | x>=帧宽| | y<0 | | y>=帧高)
return;//超出范围
int index=3*(y*帧宽度+x);
pFrame[index]=r;
pFrame[index+1]=g;
pFrame[index+2]=b;
}

请注意,
SetPixel
是否应该写入两个缓冲区,或者是否应该有一个标志来指示哪一个缓冲区,目前尚不清楚,因此我只是将
pFrame
作为占位符写入。

“但是考虑到问题的背景,它不是一个有效的解决方案。”-为什么不?
void SetPixel(int x, int y, char r, char g, char b)
{
   if (x < 0 || x >= FRAME_WIDE || y < 0 || y >= FRAME_HIGH)
       return; // out of bounds
   int index = 3 * (y * FRAME_WIDE + x);
   pFrame[index] = r;
   pFrame[index+1] = g;
   pFrame[index+2] = b;
}