小编Ric*_*ams的帖子

OpenGL:投影视图空间与NDC的协调,结果似乎超出[-1,1]范围

我一直在尝试按照教程的指示实现屏幕空间环境光遮挡.我一直在解决我的实施问题,因为我遇到过它们,但这一次让我感到难过.

我对该方法的理解如下.环境遮挡因子由从与给定片段的法线对齐的半球内取得的样本确定.为了确定样本是否有助于环境遮挡因子,我必须根据视图空间深度纹理(包含在此帖子图像的左下角)检查视图空间中的样本深度.所以我知道从深度纹理中取出哪些坐标,我必须将样本的坐标从视图空间转换为规范化设备坐标(在[-1,1]范围内),然后转换到范围[0 ,1],因此深度纹理​​有效地"映射"到视口.

下面的图像是我的场景中的环境遮挡.我知道环境遮挡本身有一个相当明显的问题(我假设半球的方向不正确),我会及时处理,但是目前我的好奇心是"闭塞"的外观是什么',表明我从视空间样本坐标移动到纹理坐标的操作是不正确的.

在此输入图像描述

由于我缺少一个稳定的着色器调试器,我可以做的调试仅限于我可以渲染到屏幕上的内容.使用以下代码创建下一个图像,其中ndcs是给定样本的规范化设备坐标:

if (ndcs.x > 1.0f || ndcs.y > 1.0f || ndcs.x < -1.0f || ndcs.y < -1.0f)
{
  gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
else
{
  gl_FragColor = vec4(vec3(1.0f), 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我希望图像完全是白色的(或者更确切地说,我正在使用这个着色器的位),但是它似乎表明我正在创建的NDC在[-1,1]范围之外,我相信一定是不正确的.它也不是屏幕的一致区域,如下图所示,相机非常接近表面:

在此输入图像描述

我以前从未使用过这个程序来获取NDC,所以我确信我的逻辑在某处肯定是错的.我已经下载了教程提供的演示代码,但我无法看到代码的不同之处.我也在网上搜索过(包括在这个网站上)我似乎无法找到任何与我自己症状相同的人.

这是我的着色器的相关代码:

Vert Shader:

v_eye_space_position = u_mvpMatrix * a_position;
v_world_space_normal = normalize(u_rotationMatrix * a_normal);
v_eye_space_normal = normalize(u_mvpMatrix * a_normal);
gl_Position = v_eye_space_position;
Run Code Online (Sandbox Code Playgroud)

Frag Shader:

// --- SSAO Testing ---
// Convert from the noise texture back to [-1,1] range …
Run Code Online (Sandbox Code Playgroud)

opengl glsl perspectivecamera projection-matrix ssao

5
推荐指数
1
解决办法
207
查看次数

#define 宏和枚举使用相同名称引起的冲突

我正在尝试将 NVIDIA 的 PhysX 集成到我的 Linux 代码库中。在它的一些头文件中,它定义了以下枚举:

\n\n

physxvisualdebuggersdk/PvdErrorCodes.h

\n\n
struct PvdErrorType\n{\n  enum Enum\n  {\n    Success = 0,\n    NetworkError,\n    ArgumentError,\n    InternalProblem\n  };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

physxprofilesdk/PxProfileCompileTimeEventFilter.h:

\n\n
struct EventPriorities\n{\n  enum Enum\n  {\n    None,       // the filter setting to kill all events\n    Coarse,\n    Medium,\n    Detail,\n    Never       // the priority to set for an event if it should never fire.\n  };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会导致以下编译错误:

\n\n
/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected identifier before numeric constant\n    Success = 0,\n    ^\n/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected \xe2\x80\x98}\xe2\x80\x99 before numeric constant\n/usr/local/include/PhysX3/physxvisualdebuggersdk/PvdErrorCodes.h:36:4: error: expected unqualified-id …
Run Code Online (Sandbox Code Playgroud)

c++ x11 enums physx

5
推荐指数
1
解决办法
3033
查看次数

标签 统计

c++ ×1

enums ×1

glsl ×1

opengl ×1

perspectivecamera ×1

physx ×1

projection-matrix ×1

ssao ×1

x11 ×1