使用opengl进行颜色切换

时间:2018-12-15 21:38:51

标签: opengl

Color Switch

我正在尝试使用OpenGL制作颜色切换游戏。

我被困在glReadPixels();方法中,我想在球体接触磁盘之前将球体的颜色与上方旋转的磁盘进行比较。

plz指导我,我很难找到想要读取像素颜色的确切位置

这就是我试图做到的方式。

unsigned char pixel[4];
glReadPixels(0, sphere_y+1, 1, 1,GL_RGB,GL_UNSIGNED_BYTE,pixel);

cout << "R = " << ((float)pixel[0])/(float)256;
cout << "G = " << ((float)pixel[1])/ (float)256;
cout << "B = " << ((float)pixel[2])/ (float)256;
cout << "A = " << ((float)pixel[3])/ (float)256;

其中

glOrtho(-10,10,-10,10,-10,10);

1 个答案:

答案 0 :(得分:2)

glReadPixels的第一个和第二个参数是片段在读取缓冲区中的窗口坐标,但不是规范化的设备坐标,甚至不是世界或模型坐标。

您必须计算圆的窗口坐标。

假设您知道世界空间中该点的 x y 坐标。世界空间坐标是由模型视图矩阵转换的点的坐标:

float test_x = .....; // world x coordinate
float test_y = .....; // world y coordinate

由于已知投影(glOrtho(-10,10,-10,10,-10,10),因此可以计算归一化的设备坐标:

float ndc_x = test_x / 10.0f; // [-10.0, 10.0] -> [-1.0, 1.0]
float ndc_y = test_y / 10.0f; // [-10.0, 10.0] -> [-1.0, 1.0]

要将其转换为窗口坐标,必须知道帧缓冲区的宽度和高度:

float width  = .....; // window width
float height = .....; // window height

float window_x = width  * (0.5 + 0.5 * ndc_x); // [-1.0, 1.0] -> [0.0, width]
float window_y = height * (0.5 + 0.5 * ndc_y); // [-1.0, 1.0] -> [0.0, height]

unsigned char pixel[4];
glReadPixels(window_x, window_y, 1, 1,GL_RGB,GL_UNSIGNED_BYTE, pixel);

由于您使用glOrtho,因此我假设您使用不赞成使用的OpenGL固定功能管道。
阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。

gluProject是一个方便的函数,可以直接从模型坐标转换为窗口坐标:

float object_x = .....; // object x coordinate
float object_y = .....; // object y coordinate

GLdouble model[16];
glGetDoublev(GL_MODELVIEW_MATRIX, model);

GLdouble proj[16];
glGetDoublev(GL_PROJECTION_MATRIX, proj);

GLint view[4];
glGetIntegerv(GL_VIEWPORT, view);

GLdouble wnd_x, wnd_y, wnd_z;
gluProject(object_x, object_y, 0.0, model, proj, view, &wnd_x, &wnd_x, &wnd_z);

unsigned char pixel[4];
glReadPixels(wnd_x, wnd_y, 1, 1,GL_RGB,GL_UNSIGNED_BYTE, pixel);