- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要增强一些具有非常精细细节的机械部件的视觉感知,因此我现在正在尝试 screen.space 环境光遮挡的不同实现。
到目前为止,我通过使用 gl.TRIANGLES
在前向渲染中将几何图形直接绘制到屏幕上,将 Canvas 分辨率加倍,并启用抗锯齿on,例如,假设我的 Canvas 样式是 800x600 px,那么我的 Canvas 宽度/高度设置为 1600x1200。只有将屏幕抗锯齿与如此高分辨率结合使用,我才能获得所需的视觉质量。
通过使用渲染缓冲区,即使以双倍分辨率渲染,由于缺乏抗锯齿功能,我也无法接近所需的质量。我尝试在额外的后处理步骤中实现许多不同的抗锯齿技术,但无论如何我无法获得干净、平滑的线条。这是我的意思的一个例子:看看图像底部的长的、稍微旋转的部分。
是否有任何方法可以通过在屏幕空间后处理过程中在后台缓冲区中绘制来获得干净、抗锯齿的线条?任何有关其他策略/技术的额外提示将不胜感激。
是否有人在 SSAO 过程中成功实现了 - 仅举一个例子 - FXAA 或类似的东西,以获得平滑的抗锯齿长对角线,而不会出现锯齿?
<小时/>这是与上图相关的片段着色器:
float compareDepths(in float depth1,in float depth2, in float aoMultiplier) {
float aoCap = 1.0;
float diff = sqrt( clamp(1.0-(depth1-depth2) / (u_aoRange/(u_zFar-u_zNear)),0.0,1.0) );
float ao = min(aoCap,max(0.0, depth1 - depth2 - u_depthTolerance) * aoMultiplier) * diff;
return ao;
}
void main(void) {
vec2 UV = v_texCoord.st;
float depth = readDepth(UV);
float d;
float pw = 1.0 / u_resolution.x;
float ph = 1.0 / u_resolution.y;
float aoCap = 1.0;
float ao = 0.0;
float aoMultiplier = u_aoMultiplier;
// 4 samples w/out loop
float aoscale=1.0;
d=readDepth( vec2(UV.x+pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x+pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
pw*=2.0;
ph*=2.0;
aoMultiplier/=2.0;
aoscale*=1.2;
d=readDepth( vec2(UV.x+pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x+pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
pw*=2.0;
ph*=2.0;
aoMultiplier/=2.0;
aoscale*=1.2;
d=readDepth( vec2(UV.x+pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x+pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
pw*=2.0;
ph*=2.0;
aoMultiplier/=2.0;
aoscale*=1.2;
d=readDepth( vec2(UV.x+pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y+ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x+pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
d=readDepth( vec2(UV.x-pw,UV.y-ph));
ao+=compareDepths(depth, d, aoMultiplier)/aoscale;
ao/=16.0;',
gl_FragColor = vec4( vec3(1.0-ao), 1.0 );
}
编辑:
下面我使用了 John Chapman 在这篇伟大的 SSAO Tutorial 中描述的 SSAO 技术。 .
左为四倍分辨率,右为全分辨率,带有分离的高斯模糊。
请注意,使用一些经典的更“有机”或“弯曲”模型(例如茶壶、斯坦福龙)不会干扰这些文物或快乐佛。这些文物在规则的几何长物体、典型的机械或建筑形状中很明显。
是否有任何方法可以通过保持质量并保留高频细节来增强深度感知,而不使用四倍的 Canvas 分辨率?
编辑2:
最终结果在视网膜显示屏上的全 Canvas 尺寸下看起来非常好,例如在 iPad 上,其分辨率为每英寸 264 像素。然而,锯齿状线条在通常为 70 或 92 DPI 的桌面显示器上清晰可见且令人不安。
我发现了这篇文章:multiresolution ambient occlusion来自 Íñigo Quílez,其中还包含一些关于高频遮挡 - 程序遮挡的提示,以增强微小的细节,但我无法理解这是否也适用于直线几何形状。有人已经做过这个实验了吗?
编辑3:
这是我迄今为止找到的关于此主题的最有用的引用:Fast Prefiltered Lines来自GPU Gems 2。有人已经与 SSAO 一起实现了此处描述的技术?
最佳答案
屏幕空间环境光遮挡
捕获低频照明。它不会捕捉锐利的阴影或漫反射或镜面照明。因此,SSAO 通常与漫反射和镜面照明相结合来创建完整的照明解决方案。
SSAO 在 3D 渲染场景中展示全局光照效果作为后期效果。它可以快速逼近昂贵的光线追踪全局照明。因此,在某些情况下(例如您的情况)可能会出现伪影。
SSAO 很少可以开箱即用,但需要一些调整。设置过程包括调整内核半径
和样本数
以获得所需的效果。 内核半径
取决于场景的自然比例
。最初可能看起来根本没有 SSAO。此时,Kernel Radius
要么太小,要么太大,必须找到工作值。请记住:SSAO 在 CPU 上的速度非常慢,但在 GPU 上的性能要好得多。
解决方案:将多个 SSAO 渲染 channel 与不同的Kernel Radii
相结合可以产生更好的效果。
看图片的右下角:
(三个相乘图像产生具有某些细节的最终图像)
关于opengl-es - SSAO 深度后处理期间的抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48523905/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!