- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个支持 Oculus Rfit 的小项目,我使用点 Sprite 来渲染我的粒子。我根据点 Sprite 与顶点着色器中“相机”的距离计算点 Sprite 的大小(以像素为单位)。在默认屏幕上(不是在 Rift 上)绘图时,尺寸完美,但当我切换到 Rift 时,我注意到这些现象:
The particles on the Left Eye are small and get reduced in size very rapidly. The particles on the Right Eye are huge and do not change in size.
截图:裂谷禁用:http://i.imgur.com/EoguiF0.jpg裂谷启用:http://i.imgur.com/4IcBCf0.jpg
这是顶点着色器:
#version 120
attribute vec3 attr_pos;
attribute vec4 attr_col;
attribute float attr_size;
uniform mat4 st_view_matrix;
uniform mat4 st_proj_matrix;
uniform vec2 st_screen_size;
varying vec4 color;
void main()
{
vec4 local_pos = vec4(attr_pos, 1.0);
vec4 eye_pos = st_view_matrix * local_pos;
vec4 proj_vector = st_proj_matrix * vec4(attr_size, 0.0, eye_pos.z, eye_pos.w);
float proj_size = st_screen_size.x * proj_vector.x / proj_vector.w;
gl_PointSize = proj_size;
gl_Position = st_proj_matrix * eye_pos;
color = attr_col;
}
st_screen_size 统一是视口(viewport)的大小。由于我在 Rift 上渲染时使用单个 frambuffer(每只眼睛一半),st_screen_size 的值应该是(frabuffer_width/2.0,frambuffer_height)。
这是我的绘制调用:
/*Drawing starts with a call to ovrHmd_BeginFrame.*/
ovrHmd_BeginFrame(game::engine::ovr_data.hmd, 0);
/*Start drawing onto our texture render target.*/
game::engine::ovr_rtarg.bind();
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Update the particles.
game::engine::nuc_manager->update(dt, get_msec());
/*for each eye... */
for(unsigned int i = 0 ; i < 2 ; i++){
ovrEyeType eye = game::engine::ovr_data.hmd->EyeRenderOrder[i];
/* -- Viewport Transformation --
* Setup the viewport to draw in the left half of the framebuffer when we're
* rendering the left eye's view (0, 0, width / 2.0, height), and in the right half
* of the frambuffer for the right eye's view (width / 2.0, 0, width / 2.0, height)
*/
int fb_width = game::engine::ovr_rtarg.get_fb_width();
int fb_height = game::engine::ovr_rtarg.get_fb_height();
glViewport(eye == ovrEye_Left ? 0 : fb_width / 2, 0, fb_width / 2, fb_height);
//Send the Viewport size to the shader.
set_unistate("st_screen_size", Vector2(fb_width /2.0 , fb_height));
/* -- Projection Transformation --
* We'll just have to use the projection matrix supplied but he oculus SDK for this eye.
* Note that libovr matrices are the transpose of what OpenGL expects, so we have to
* send the transposed ovr projection matrix to the shader.*/
proj = ovrMatrix4f_Projection(game::engine::ovr_data.hmd->DefaultEyeFov[eye], 0.01, 40000.0, true);
Matrix4x4 proj_mat;
memcpy(proj_mat[0], proj.M, 16 * sizeof(float));
//Send the Projection matrix to the shader.
set_projection_matrix(proj_mat);
/* --view/camera tranformation --
* We need to construct a view matrix by combining all the information provided by
* the oculus SDK, about the position and orientation of the user's head in the world.
*/
pose[eye] = ovrHmd_GetHmdPosePerEye(game::engine::ovr_data.hmd, eye);
camera->reset_identity();
camera->translate(Vector3(game::engine::ovr_data.eye_rdesc[eye].HmdToEyeViewOffset.x,
game::engine::ovr_data.eye_rdesc[eye].HmdToEyeViewOffset.y,
game::engine::ovr_data.eye_rdesc[eye].HmdToEyeViewOffset.z));
/*Construct a quaternion from the data of the oculus SDK and rotate the view matrix*/
Quaternion q = Quaternion(pose[eye].Orientation.w, pose[eye].Orientation.x,
pose[eye].Orientation.y, pose[eye].Orientation.z);
camera->rotate(q.inverse().normalized());
/*Translate the view matrix with the positional tracking*/
camera->translate(Vector3(-pose[eye].Position.x, -pose[eye].Position.y, -pose[eye].Position.z));
camera->rotate(Vector3(0, 1, 0), DEG_TO_RAD(theta));
//Send the View matrix to the shader.
set_view_matrix(*camera);
game::engine::active_stage->render(STAGE_RENDER_SKY | STAGE_RENDER_SCENES | STAGE_RENDER_GUNS |
STAGE_RENDER_ENEMIES | STAGE_RENDER_PROJECTILES, get_msec());
game::engine::nuc_manager->render(RENDER_PSYS, get_msec());
game::engine::active_stage->render(STAGE_RENDER_COCKPIT, get_msec());
}
/* After drawing both eyes into the texture render target, revert to drawing directly to the display,
* and we call ovrHmd_EndFrame, to let the Oculus SDK draw both images properly, compensated for lens
* distortion and chromatic abberation onto the HMD screen.
*/
game::engine::ovr_rtarg.unbind();
ovrHmd_EndFrame(game::engine::ovr_data.hmd, pose, &game::engine::ovr_data.fb_ovr_tex[0].Texture);
这个问题已经困扰我好几天了……我觉得我已经走到了死胡同。我可以只使用广告牌四边形.....但我不想轻易放弃 :) 加点 Sprite 更快。在 Rift 上渲染时,基于距离变化的点大小衰减背后的数学原理是什么?是不是没有考虑到什么?数学不是(但至少)我的强项。 :) 任何见解将不胜感激!
PS:如果需要有关我发布的代码的任何其他信息,我会很乐意提供。
最佳答案
我可以推荐一些故障排除技巧。
首先,修改您的代码以自动编写渲染的第一帧的屏幕截图(或者,如果这不方便,只需使用一个静态 bool 值,它会导致主绘图跳过除第一帧之后的开始/结束帧调用之外的所有内容SDK 有时会弄乱 OpenGL 状态机,如果发生这种情况,那么您所看到的可能是在 ovrHmd_EndFrame() 中完成的工作的结果,在随后通过渲染循环的过程中搞砸了渲染。其他在您的渲染代码中(在粒子渲染之后)可能会无意中恢复所需的状态,这就是渲染的第二只眼睛看起来不错的原因。
其次,我会尝试将渲染的眼睛分成两个帧缓冲区。也许您的代码中有些东西意外地对整个帧缓冲区做了一些事情(比如清除深度缓冲区),这导致了差异。根据顶级代码,您可能正在使用与您预期的帧缓冲区不同的状态运行第二只眼睛。分成两个帧缓冲区会告诉您是否是这种情况。
您可能会运行的另一项测试与第二项测试类似,它是重构您的渲染代码以允许您使用默认帧缓冲区通过此循环,而无需调用 Oculus SDK。这是另一种技术,可帮助您确定问题是出在 SDK 中还是出在您自己的呈现代码中。只需将两个眼睛 View 渲染到屏幕的两半,而不是屏幕外帧缓冲区的两半。
关于c++ - Oculus Rift + 点 Sprite + 点大小衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28100073/
我写了这个简单的代码: public class Test { public static void main(String args[]) { OculusRift ocul
我正在开发一个项目,该项目将一些渲染卸载到我为 Unity 编写的 native 插件,以便利用实例化和其他高级图形功能。我正在为跨平台版本开发它,但我使用的是 Mac,因此测试主要使用 OpenGL
我们正在进行一项实验,在该实验中,HMD的用户必须体验多种旋转增益。我的意思是,我们希望将用户头部的相对旋转更改为虚拟世界中的旋转增益。 例如,旋转增益为2表示当我在现实生活中将头的偏航度更改为45度
我正在使用 oculus 编写应用程序,但相机设置有问题。只是有时一切正常,相机开始晃动,我们正在看的模型似乎在抖动。到目前为止有人遇到同样的问题吗? 更新相机矩阵的代码如下: // Concaten
我有一台配备眼动仪的 Oculus Rift,用于根据眼动仪输入显示实时图像。我想听听您对我处理 Rift 显示的方式的意见(对吗?)。 我有一个简单文本的基本图像,它是根据眼动仪的注视坐标使用 Op
我正在尝试修改 Oculus World Demo 以显示来自相机的视频流而不是预设图形,但是,我发现很难找到渲染 cv::IplImage 或 cv 的正确方法::mat 图像类型到 Oculus
我想在 javascript 中为 oculus rift 实现桶形着色器。 根据此视频 (http://youtu.be/B7qrgrrHry0?t=11m26s),桶形畸变的半径函数为: newr
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我从 Oculus Rift 网站下载了 SDK,我正在尝试运行项目在示例文件夹中。当我构建项目时,出现错误 fatal error C1083: Cannot open open include f
我一直有兴趣为 Blender(一种动画软件)创建一个附加组件,允许使用 Oculus Rift 制作动画。 Oculus Rift SDK 使用 C 语言运行,但 Blender 使用 Python
目前,我正在尝试编写一个脚本,为只有一个功能 ARM 的用户将一个 Controller 的 Action 映射到另一个 Controller 上。我如何将一个 Controller 的位置镜像到另一
在我的 animate() 函数中,我有以下代码: if (this.controls.forward) { // move in direction we look at var
我正在编写一个支持 Oculus Rfit 的小项目,我使用点 Sprite 来渲染我的粒子。我根据点 Sprite 与顶点着色器中“相机”的距离计算点 Sprite 的大小(以像素为单位)。在默认屏
我想为 Oculus Rift 编写代码并从我的程序中完全访问 Facebook API。对我来说,这有点跳入深渊,但这并不重要。我有一定的编程知识,该学什么就学什么。 现在对于上述组合,我在想: C
好的,我正在尝试做这里写的事情 https://developer.oculus.com/documentation/pcsdk/latest/concepts/dg-sensor/ 但我对#incl
我正在尝试设置我的第一个 C/C++使用 Oculus SDK for Windows (8.0.0) 的 Oculus Rift 项目在OpenGL上下文,但我无法使其正常运行。 每当我尝试编译所提
我有 Oculus Rift VR,我从他们的网站下载了 SDK。我正在使用 Visual Studio 2010 Pro,我做了他们在 WIKI 页面中提到的所有事情最小的 Oculus 应用程序教
我不想在跟踪传感器移动 22.5 度时关闭“重置位置”。 我们是一家制造在场景中行走的设备的公司。有时我们想围绕玩家旋转“跟踪传感器”。现在每次我们这样做时,“跟踪传感器”设备都会重置 hmd。这会导
我希望能够在 Unity 5 中看到双眼的输出。使用最新的 OVR 插件,unity 只显示单眼。此外,它似乎甚至在耳机上也呈现单视场效果。 我想要一个例子,它可以让我在左眼上显示蓝色矩形,在右眼
有了 Unity 5.1 和 Oculus SDK 0.6 以及新的内置 Virtual Reality Supported 复选框,我似乎无法改变相机在 VR 中的位置。 当然我可以更改相机的 Tr
我是一名优秀的程序员,十分优秀!