首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用opengl进行颜色切换

问使用opengl进行颜色切换
EN

Stack Overflow用户
提问于 2018-12-16 05:38:51
回答 1查看 89关注 0票数 0

​

​

我试着用OpenGL做颜色切换游戏。

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

请指导我,我发现很难找到准确的位置,我想要读取像素颜色

这就是我尝试做的事情。

代码语言:javascript
复制
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;

哪里

代码语言:javascript
复制
glOrtho(-10,10,-10,10,-10,10);
EN

回答 1

Stack Overflow用户

发布于 2018-12-16 17:07:13

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

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

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

代码语言:javascript
复制
float test_x = .....; // world x coordinate
float test_y = .....; // world y coordinate

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

代码语言:javascript
复制
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]

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

代码语言:javascript
复制
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 Specification和Shader以了解最先进的呈现方式。

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

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53797483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档