- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在片段着色器中采样全屏纹理的最佳方法是什么,例如延迟渲染器中的 g 缓冲区,或后处理着色器中的场景纹理?
目前我使用以下两种方式:
将屏幕尺寸作为统一值传递给着色器,并根据 gl_FragCoord
计算 (u,v):
vec2 texCoord = gl_FragCoord.xy / vScreenSize;
vec3 c = texture( tex, texCoord ).rgb;
似乎并不理想,因为需要进行除法,并且为着色器提供屏幕尺寸很麻烦。
将 gl_FragCoord.xy
转换为 ivec
并使用 texelFetch
:
vec3 c = texelFetch( tex, ivec2(gl_FragCoord.xy), 0 ).rgb;
也不理想,因为需要从 float
转换为 int
。
那么有没有更好的办法呢?我真的只想在像素着色器绘制的确切位置对缓冲区进行采样。
<小时/>//编辑:
<小时/>好的,根据来自顶点着色器的插值纹理坐标的建议,我设法找出以下代码:
顶点着色器:
#version 150
uniform mat4 im_ModelViewProjectionMatrix;
in vec3 iv_Vertex;
noperspective out vec2 vVertCoord;
void main( void )
{
gl_Position = im_ModelViewProjectionMatrix * vec4(iv_Vertex, 1.0);
vVertCoord = (gl_Position.xy / gl_Position.w) * (0.5) + vec2(0.5);
}
我基本上通过透视除法从剪辑空间位置计算归一化设备坐标 (NDC),然后将 NDC(范围从 [-1,1])映射到区间 [0,1]。这对于全屏四边形非常有用(即使没有透视划分,因为坐标非常简单)。不过,我需要在延迟渲染器中绘制为光几何的任意几何体存在一些问题。在顶点着色器中,我输出 vVertCoord
作为 red=x 和 green=y 的颜色:
#version 150
noperspective in vec2 vVertCoord;
out vec4 colorOut;
void main( void )
{
colorOut = vec4(vVertCoord.x, vVertCoord.y, 0, 1);
}
这是我在点光球内时的结果,一切看起来都很好(黑线是故意渲染的):
但是,如果我更接近光几何,结果就是:
左上角的红色补丁在那里做什么?您不希望在禁用调试颜色的情况下看到真实颜色的结果,因为它看起来像 lsd-trip,当您移动相机时,一切都会扭曲。这与精度有关吗?请注意,当我在像素着色器中使用 gl_FragCoord 时,一切都很好。
最佳答案
如果您只需从顶点着色器传入插值顶点坐标,则无需执行任何特殊数学运算。
例如,如果您正在绘制一个覆盖屏幕的简单单位正方形,您就可以接收全屏纹理,您可以执行如下操作:
vertex shader pseudocode:
layout(position = 0) in vec3 in_vertex;
out vec3 out_vertex;
void main()
{
//Do your matrix multiplications to your in_vertex to get its final position...
out_vertex = in_vertex;
}
然后,您的顶点着色器将正确地将 in_vertex 插值到 x:0...1、y:0...1 范围内(只要您正在绘制单位正方形)并将其传递给您的片段着色器。然后你的片段着色器将像这样使用它:
fragment shader pseudocode:
in vec3 out_vertex;
uniform sampler2D tex;
void main()
{
gl_fragcolor = texture(tex,vec2(out_vertex.x,out_vertex.y));
}
不需要其他数学运算,只要注意 out_vertex 只在 0...1 的范围内即可。为了稍微扩展一下这个例子,想象一下我们的正方形:
(0,1)+------------+(1,1)
| |
| |
| |
| |
| |
(0,0)+------------+(0,1)
我们想在正中心采样这个点:
(0,1)+------------+(1,1)
| |
| |
| * |
| |
| |
(0,0)+------------+(0,1)
我们的顶点着色器将自动从其他 4 个位置插入该位置,并将以下 vec3 传递给片段着色器:
out_vertex = vec3(0.5,0.5,0);
然后可以使用它来成功采样纹理
关于opengl - 全屏纹理采样的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23113247/
我正在尝试使用 Qt 制作游戏,因为它太棒了 ;) 而且您可以免费获得所需的所有东西。唯一的问题是更改系统分辨率和设置 QWidget(或 QGLWidget)“真正的”全屏。 你们中有人成功地做到了
有没有办法以全屏模式(没有工具栏、导航)启动 gwt-app? 我只找到了打开新窗口的提示: Window.open("SOMEURL","SOMETITLE", "fullscreen=yes
if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscr
我想解释一下我现在在做什么。我开发了一个 aar(sdk) 并且运行良好。但是,我希望我的 sdk 在被调用时占据全屏,即使调用者有一个工具栏。我尝试了此链接中的示例 [ How to set act
我是 Blazor 的新手,我正在尝试了解如何以全屏模式打开浏览器。我知道我可以执行 Javascript 中断并运行 Javascript,但这违背了 Blazor 的目的。 如何在 Blazor
我正在创建一个全屏应用程序,并且想知道是否有某种方法可以使 NSAlert 位于我创建的 CGDisplayCapture 之上。现在,NSAlert 显示在显示捕获后面。我的主窗口显示得很好(在使用
有人可以解释一下下面的代码是如何工作的吗? 元素指的是视频,全屏指的是页面上的链接。 我无法理解 if 语句 var element = document.getElementById('elemen
我想要实现的是类似于 Instagram 应用内网络浏览器,在您点击广告时使用: 我所做的是,我使用了 WebView bottomSheetDialogFragment,并覆盖了 onCreateD
第二个 ViewController 的顶部有这个空间,它几乎在手机上显示为可关闭的弹出窗口。如何使全屏显示(删除橙色箭头指向的空间)? 最佳答案 这是 iOS 13 的一项更改。用户将开始期望能够滑
我正在尝试在全屏模式下使用 emacs 并使用合适的字体。我有一台运行 Ubuntu 的基于 nvidia 的笔记本电脑。首次加载时,字体很大,认为是 16pt 字体。我使用菜单选项设置了合适的字体(
我有一个 GridView,我使用 BaseAdapter 来调整我的 GridView 中的图像和文本。我有一个问题,当我运行我的应用程序时,我的“GridView”有左、右、上和下边距。我不需要这
是否可以在全屏模式下使用 Android Studio 例如只有我们编码的那个字段应该显示在整个屏幕上。 像这样: 最佳答案 您可以使用“无干扰模式”: 关于全屏 Android Studio,我们在
我正在制作一个应用程序,当手机处于纵向时,我需要 fragment 显示菜单栏(带有设置快捷方式等),但当它处于横向时,我需要全屏。 因此,我有一个管理 2 个 fragment 的 Activity
我想知道是否可以在没有标签栏和导航栏的情况下全屏推送 NavigationController 的 ViewController。我的问题如下: 我的应用在 TabBarController 中嵌入了
我制作了一个1920 * 1048的flash(16:9的屏幕),并将其嵌入到html中喜欢: 问题是: 在 4:3 屏幕中,flash 的宽度为 100%,但顶部和底部有白色填充。看来闪光灯
我想制作一个同时包含多个文本的HTML5视频。 文本应该以不同的css布局(文本颜色、字体、阴影)显示在视频的不同位置(同时) 我试过这个教程http://www.artandlogic.com/bl
需要一些帮助。 我需要水平滑动一次长图像,然后再水平滑动回来...我在这里学习了一个教程 https://css-tricks.com/creating-a-css-sliding-backgroun
我正在制作一个简单的登录页面,并试图将以下图像作为背景全屏:image 我的 CSS 目前看起来像这样: body { background-image: url('/images/bg.jp
我想用透明色覆盖我的背景图片,但颜色没有覆盖背景图片。 这是我的演示: http://jsfiddle.net/farna/73kx2/ CSS 代码: .overlay{ backgroun
有什么方法可以隐藏状态栏并保持操作栏可见吗? 最佳答案 是的,有。您应该在 Activity 的 onCreate 方法中设置 FLAG_FULLSCREEN。 @Override public vo
我是一名优秀的程序员,十分优秀!