首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PBO缓冲液含量是什么意思?

PBO缓冲液含量是什么意思?
EN

Stack Overflow用户
提问于 2018-08-24 04:18:13
回答 2查看 206关注 0票数 0

我试图通过使用PBO (使用OpenGL的像素缓冲区对象)来实现颜色选择系统,当我完成时,我意识到在映射时从PBO中出来的数字根本没有任何意义。我让我的应用程序呈现不同颜色的大方格,结果在这些不同颜色之间进行了更改,但是即使在分析了数字之后,我也无法理解它。

例如,单击纯红色给出字节(-1,0,0),而纯蓝色给出(0,0,-1),但与所有逻辑相反,纯绿色给出(-1,0,-1),青色也给出(-1,0,0),黄色给出(76,-1,0)。

显然,这些数字是错误的,因为两种不同的颜色可能导致相同的字节形成。一个完全红色的颜色不应该是(127,0,0)吗?

这里是我用于初始化的代码,大小为3,因为我只读取一个像素。

代码语言:javascript
复制
pboid = glGenBuffersARB(); //Initialize buffer for pbo
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, pboid); //bind buffer
glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT, 3,GL_DYNAMIC_READ); //create a pbo with 3 slots
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0); //unbind buffer

这是我用来读取像素的代码

代码语言:javascript
复制
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, pboid); //Bind the pbo
glReadPixels((int)lastMousePosition.x,(int)lastMousePosition.y,1,1, GL_RGB, GL_UNSIGNED_BYTE, 0); //Read 1 pixel
ByteBuffer colorBuffer = glMapBufferARB(GL_PIXEL_PACK_BUFFER_EXT, GL_READ_ONLY_ARB); //Map the buffer so we can read it
for(int x = 0; x < colorBuffer.limit(); x++)
{
    System.out.println("color byte: " + colorBuffer.get(x)); //Print out the color byte
}
glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_EXT); //Unmap the buffer so it can be used again
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0); //Unbind the pbo

如果我做错了任何假设,请纠正我。我计划使用这个系统来判断哪个gui元素是被点击的,方法是将每个gui元素呈现给一个具有唯一颜色的fbo,并测试单击了哪个像素的颜色。谢谢你能帮忙的人!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-25 11:21:45

终于,我终于找到了这个问题!

首先,使用Byte.toUnsignedInt(字节),您可以将pbo提供的颜色转换为传统的0-255范围rgb数字。

其次,这是主要问题,当OpenGL请求像素坐标来填充pbo时,它相对于右下角。我的问题是,我使用的是GLFW,它给出了相对于右上角的坐标,这意味着屏幕垂直中部的颜色选择是准确的,但是当选择其他地方的颜色时,它得到了屏幕的相反部分。要解决这个问题,只需从窗口高度减去鼠标单击的y坐标即可。

谢谢你的帮助和想法!

票数 1
EN

Stack Overflow用户

发布于 2018-08-24 07:20:33

有几种可能性,但我没有设置我的openGL系统来测试--但是您可以尝试这些方法。我也不太了解Java ( C,C++等是我的领域)

编辑

1)您要求从GL_UNSIGNED_BYTE中获取glReadPixels()数据,但您正在以签名格式打印出来。GL_UNSIGNED_BYTE的值为0-256,所以不可能有负值!尝试将打印出来的格式设置为UNSIGNED_BYTE,看看结果如何。(从您的代码中,我可以看到现在这个问题已经解决了)。

2)正如德哈斯在他的评论中指出的那样,您不应该使用OpenGL缓冲区函数的ARB (architecture Review Board)扩展版本,因为这些都是OpenGL核心的一部分,已经有相当长的时间了。有关版本历史记录,请参见OpenGL。从这里我可以看到,glBindBufferARB (例如)在2003年被废弃了。它可能影响或不影响您的特定问题,但是将glXXXXXARB()替换为glXXXXX()解决方案,并确保您的OpenGL库是最近的(v4或更高版本)。

3)还可以使用derhass来读取GitHub代码,您的getMousePosition()通过glfwGetCursorPos返回屏幕坐标(0,0是窗口的左上角),因此需要转换为视图端口坐标(0,0是左下角)来读取框架缓冲区。您在GitHub的代码似乎没有进行转换。

4)此外,你根本不需要使用PBO来进行基本的颜色选择。glReadPixels()默认目标是框架缓冲区,因此您可以安全地免除VBO,直接从框架缓冲区获取颜色、深度和模板数据。(您需要启用深度和模板缓冲区)。

5)如果在3D场景中进行选择,还需要将视口坐标和深度转换回世界坐标,以便识别您单击的对象。有关选择的一些想法,请参见selection

我希望所有这些都能对我们有所帮助,尽管这对我们双方来说都是一次学习的经历。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51997421

复制
相关文章

相似问题

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