拦截opengl调用并创建多视点和多视口

时间:2013-12-24 09:29:33

标签: opengl graphic

我想在任何其他基于OpenGL的应用程序和原始OpenGL库之间创建一个层。它无缝拦截应用程序发出的OpenGL调用,并将图像呈现并发送到显示器,或将OpenGL流发送到渲染集群。

我已完成openg32.dll替换原始库,我不知道下一步该怎么做,

如何将OpenGL调用转换为图像以及什么是OpenGL流?

准确描述。访问the Opengl Wrapper

2 个答案:

答案 0 :(得分:3)

首先,OpenGL不是图书馆。这是一个API。您系统上的opengl32.dll是一个库,它提供API并充当实际图形驱动程序附加到程序的锚点。

接下来,拦截OpenGL调用并将它们变成不同的东西是很糟糕的,比如多个视口。它可能适用于固定功能管道,但只要着色器涉及它就会破坏你所连接的程序。 OpenGL被设计为一个用于将事物绘制到屏幕上的API,它不是场景图。程序期望当他们进行OpenGL调用时,他们将根据绘图命令在像素缓冲区中生成图像。现在,如果您进入该过程并大幅改变结果,那么任何依赖于先前渲染的视觉结果的图形算法都会中断。例如,任何形式的阴影映射都将被你所做的打破。<​​/ p>

如果程序在进行实际的OpenGL调用之前执行内部截头操作之类的操作,那么像多个视口黑客这样的东西也可能不起作用。这也是因为OpenGL是一个绘图API,而不是场景图。

最后是的,您可以挂钩到OpenGL,但无论您做什么,您都必须确保应用程序根据规范执行OpenGL调用。有一个授权的OpenGL规范是有原因的,即程序依赖它来获得可预测的结果。

答案 1 :(得分:2)

OpenGL几乎无疑可以让你在不做疯狂修改的情况下做你想做的事情。在渲染功能中,可以通过执行以下操作来完成多视点

glViewport(/*View 1 window coords*/0, 0, window_width, window_height / 2);

// Do all of your rendering for the first camera

glViewport(/*View 2 window coords*/0, window_height / 2, window_width, window_height);

glMatrixMode(GL_MODELVIEW);

// Redo your modelview matrix for a different viewpoint here, then re-render it all.

就像使用glViewport指定的两个区域两次渲染一样简单。如果您在Google周围,可以获得更详细的教程。如果它是由显卡实现的话,我强烈建议不要使用OpenGL作为一个很好的交易,你应该真的只使用你给的。如果你正在修改它,你可能做错了。它可能让你以更好的方式做到这一点。

祝你好运!