- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试实现类似游戏 Antichamber 的东西(更准确地说,这个技巧如下所示)过去一周:
这是我希望实现的目标的视频(即使它是使用虚幻引擎 4 完成的;我没有使用它):https://www.youtube.com/watch?v=Of3JcoWrMZs
我查找了执行此操作的最佳方法,并发现了模板缓冲区。之间this文章和 this我在网上找到的代码(“drawPortals()”函数)我几乎实现了它。
它可以很好地与一个传送门连接到另一个房间(不是一个可穿越的传送门,这意味着你不能穿过它并被传送到另一个房间)。在我的例子中,我正在绘制一个通往一个简单方形房间的门户,里面有一个球体;在门户后面有另一个球体,我用来检查深度缓冲区是否正常工作并将其绘制在门户后面:
当我添加另一个靠近此门户的门户时,就会出现问题。在这种情况下,我设法正确显示了另一个门户(灯光关闭,但右侧的球体颜色不同,以表明它是另一个球体):
但是,如果我转动相机,使第一个入口必须绘制在第二个上方,那么第一个入口的深度就会出错,第二个入口就会绘制在第一个上方,如下所示:
虽然它应该是这样的:
所以,这就是问题所在。我可能在深度缓冲区上做错了什么,但我找不到什么。
我的渲染部分代码几乎是这样的:
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
// First portal
glPushMatrix();
// Disable writing to the color and depht buffer; disable depth testing
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
// Make sure that the stencil always fails
glStencilFunc(GL_NEVER, 1, 0xFF);
// On fail, put 1 on the buffer
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
// Enable writing to the stencil buffer
glStencilMask(0xFF);
// Clean the buffer
glClear(GL_STENCIL_BUFFER_BIT);
// Finally draw the portal's frame, so that it will have only 1s in the stencil buffer; the frame is basically the square you can see in the pictures
portalFrameObj1.Draw();
/* Now I compute the position of the camera so that it will be positioned at the portal's room; the computation is correct, so I'm skipping it */
// I'm going to render the portal's room from the new perspective, so I'm going to need the depth and color buffers again
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
// Disable writing to the stencil buffer and enable drawing only where the stencil values are 1s (so only on the portal frame previously rendered)
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 1, 0xFF);
// Draw the room from this perspective
portalRoomObj1.Draw();
glPopMatrix();
// Now the second portal; the procedure is the same, so I'm skipping the comments
glPushMatrix();
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glStencilFunc(GL_NEVER, 1, 0xFF);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
glStencilMask(0xFF);
glClear(GL_STENCIL_BUFFER_BIT);
portalFrameObj2.Draw();
/* New camera perspective computation */
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
glStencilMask(0x00);
glStencilFunc(GL_EQUAL, 1, 0xFF);
portalRoomObj2.Draw();
glPopMatrix();
// Finally, I have to draw the portals' frames once again but this time on the depth buffer, so that they won't get drawn over; first off, disable the stencil buffer
glDisable(GL_STENCIL_TEST);
// Disable the color buffer
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glClear(GL_DEPTH_BUFFER_BIT);
// Draw portals' frames
portalFrameObj1.Draw();
portalFrameObj2.Draw();
// Enable the color buffer again
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
/* Here I draw the rest of the scene */
最佳答案
现在已经有一段时间了。由于不会有答案(可能),我正在写我现在正在使用的解决方法。
我尝试使用不同的模板函数解决问题,并且在渲染新门户时不清空模板缓冲区;这个想法是利用我知道的事实,通过查看之前渲染门户的模板缓冲区。
最后,我没能做到;在我在原始问题中发布的示例中,两个门户中的一个总是掩盖了另一个的部分。
所以,我决定做一些更简单的事情:我检查一个门户是否可见,然后我按照我在问题中发布的代码完全绘制它(因此每次清空模板缓冲区)。
在伪代码中,我这样做:
for(var i = 0; i < PORTALS_NUMBER; i++)
{
// I get the normal to the portal's frame and its position
var normal = mPortalFramesNormals[i];
var framePos = mPortalFrames[i].GetPosition();
// I compute the scalar product between the normal and the direction vector between the camera's position and the frame's position
var dotProduct = normal * (currentCameraPosition - framePos);
// If the dot product is 0 or positive, the portal is visible
if(dotProduct >= 0)
{
// I render the portal
DrawPortal(mPortalFrames[i], mPortalRooms[i]);
}
}
glDisable(GL_STENCIL_TEST);
// Now I draw the portals' frames in the depth buffer, so they don't get overwritten by other objects in the scene
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
for(var i = 0; i < PORTALS_NUMBER; i++)
{
mPortalFrames[i].Draw();
}
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
关于opengl - 如何实现 "portal rendering",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38287235/
在进行一些研发时,我搞砸了我的 IBM WebSphere 门户登录页面。我在登录页面上附加了一个自定义 portlet 以及原始登录 portlet。现在登录页面没有显示,我无法访问管理工具。我现在
打开浏览器 导航至http://www.windowsazure.com/en-us/ 选择右上角的门户 使用我的电子邮件地址登录 收到以下错误 https://manage.windowsazure
我正在使用 IBM Portal API 来开发 Websphere Portal Server 中的一些页面,但我希望在嵌套在我的主门户中的虚拟门户的上下文中工作。我已经阅读了 IBM 的文档,但我
我是liferay的新手,我需要从Liferay6.1升级到Liferay6.2。如果我们可以覆盖 Portal-setup-wizard.properties 中的主题,我不知道 Portal-ex
我目前正在使用EXTjs的默认Portal Demo.. http://docs.sencha.com/ext-js/4-2/extjs-build/examples/portal/portal.ht
我用 spring mvc 3 框架创建了一个 portlet(jsr286)。如果页面有 SSA(服务器端聚合),它工作正常,但是当使用 CSA(客户端聚合)时它停止工作。 我正在使用 WPS 7.
我正在使用 IBM WebSphere Portal,IBM WebSphere Portal 中的 /wps/portal 和 /wps/myportal 有什么区别? 最佳答案 /wps/port
是否有人将SAP Portal与第三方Web内容管理系统(例如Vignette)集成在一起?我没有太多接触SAP Portal,但是我知道它提供了J2EE App Server,并且有一种叫做iVie
我已使用设置 ADFS 的公司帐户登录 Azure 门户。现在,我想使用另一个帐户登录Azure Portal。但是,当我尝试打开 portal.azure.com 时,它总是将我重定向到我的公司登录
我已使用设置 ADFS 的公司帐户登录 Azure 门户。现在,我想使用另一个帐户登录Azure Portal。但是,当我尝试打开 portal.azure.com 时,它总是将我重定向到我的公司登录
我正在尝试设置单元测试。我正在使用 Struts2 和 Liferay 6.1。 我收到以下错误 java.lang.NullPointerException at com.liferay.porta
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
是否有一种方法,仅使用标准 oracle JSR-286 类来获取 portlet 请求后面的 HttpServletRequest?这里是liferay特有的方法 HttpServletReques
因此,Portals 解决的一个有趣且令人惊奇的属性是即使您的组件需要在其他地方呈现,也可以保留 Provider 的 Context。如果您使用 ContextProvider 包装组件子树,则在该
我一直在尝试实现类似游戏 Antichamber 的东西(更准确地说,这个技巧如下所示)过去一周: 这是我希望实现的目标的视频(即使它是使用虚幻引擎 4 完成的;我没有使用它):https://www
我正在使用 Angular 2 构建一个门户。该门户应该能够托管多个应用程序(portlet)并且应该作为一个容器。 Portlet 也可以使用/不使用 Angular 2 构建。它们将是由独立团队管
谁能解释一下堺的 sleep 传送门和皮肤的用途吗?我想问的是,如何启用这些功能以及 Sakai 中的 neo 皮肤和 neo 门户代码有什么区别? 提前致谢。 最佳答案 Morpheus(使用 Sa
我正在为 WebSphere Portal 8 创建一个 portlet,并且想要检索呈现我的 portlet 的页面名称。这很重要,因为根据页面的不同,Portlet 将以不同的方式提供内容 我尝试
从 react 门户的文档: A typical use case for portals is when a parent component has an overflow: hidden or
我创建了这支笔来演示它:https://codepen.io/no1melman/pen/WWyJqQ 基本上我有这个门户: const ChatArea = ({ children }) => {
我是一名优秀的程序员,十分优秀!