我试图通过制作一个Minecraft克隆来学习OpenGL和LWJGL,但我被卡住了
我能够轻松渲染块并拥有带有wasd控件的第一人称摄像头,现在我正在尝试放置块,但我无法弄清楚如何能够检查哪个多维数据集和哪一侧我正在查看/位于屏幕中心的那个立方体,所以我可以将另一个立方体放在该立方体附近。
我正在使用gluPerspective作为3d透视图和glRotatef旋转世界,非常正常的东西
答案 0 :(得分:3)
一种技术是使用id-buffer。您可以使用帧缓冲区一次将场景绘制为两个纹理。第一个纹理将是典型的颜色纹理。第二个是存储整数的纹理。在绘制场景之前,为每个立方体面指定一个数字。您将这些数字传递给着色器(统一变量适用于此)。片段着色器将“绘制”这些数字到整数纹理,同时对颜色纹理进行正常着色。当您需要找到鼠标光标处的内容时,请使用glReadPixels()
。
这是假设您使用的是现代OpenGL(3或更高版本)。如果您遇到固定功能管道(跛脚),您还可以为每个立方体面指定一种唯一的颜色,并使用纯色绘制到后面的缓冲区。确保关闭纹理等。完成后,使用glReadPixels()
查找鼠标光标处绘制的内容。然后你再次正常绘制并交换缓冲区。 (这里有一些过时的代码,显示了我所说的内容:http://www.lighthouse3d.com/opengl/picking/index.php3?color1)
另一种技术是通过屏幕“投射光线”。基本上,您可以针对几何体中的每个形状测试几个方程式,如果这些测试通过,则会有一个交点,并且您知道单击的形状。我对这种方法不太熟悉,所以我会留给其他人解释他们是否愿意。