【发布时间】:2012-07-09 06:25:05
【问题描述】:
我有一个通过 FBO 渲染到纹理的场景,我从片段着色器中对其进行采样,使用图元而不是绘制全屏四边形来绘制它的区域:我通过仅生成片段来节省资源会需要。
为了测试这一点,我发布了与纹理渲染完全相同的几何图形,这意味着生成的光栅化图案应该完全相同:当我的片段着色器使用给定的不同坐标查找其纹理时,它应该与给出的其他值完美匹配。
以下是我如何为片段着色器提供坐标以使用我的全屏纹理自动纹理化几何体:
// Vertex shader
uniform mat4 proj_modelview_mat;
out vec2 f_sceneCoord;
void main(void) {
gl_Position = proj_modelview_mat * vec4(in_pos,0.0,1.0);
f_sceneCoord = (gl_Position.xy + vec2(1,1)) * 0.5;
}
我在 2D 中工作,所以我不关心这里的视角鸿沟。我只是使用从 [-1,1] 缩小到 [0,1] 的剪辑空间位置设置了 sceneCoord 值。
uniform sampler2D scene;
in vec2 f_sceneCoord;
//in vec4 gl_FragCoord;
in float f_alpha;
out vec4 out_fragColor;
void main (void) {
//vec4 color = texelFetch(scene,ivec2(gl_FragCoord.xy - vec2(0.5,0.5)),0);
vec4 color = texture(scene,f_sceneCoord);
if (color.a == f_alpha) {
out_fragColor = vec4(color.rgb,1);
} else
out_fragColor = vec4(1,0,0,1);
}
请注意,如果我的 alpha 不匹配,我会吐出一个红色片段。纹理渲染将每个渲染对象的 alpha 设置为特定索引,因此我知道什么与什么匹配。
抱歉,我没有要显示的图片,但很明显,我的像素偏离了 (0.5,0.5):我的对象周围出现了一个细的、一个像素的红色边框,在它们的底部和左侧,它会弹出出来。它看起来很“短暂”。赠品是它只显示在对象的底部和左侧。
请注意,我有一行注释掉了使用texelFetch:此方法有效,我不再显示我的红色片段。但是,我希望使用texture 和标准化纹理坐标来使其正常工作,因为我认为更多的硬件会支持它。也许真正的问题是,是否有可能在不通过制服发送我的视口分辨率的情况下做到这一点?必须有办法避免这种情况!
更新:我尝试将纹理访问移动半个像素、四分之一像素、百分之一像素,这一切都让情况变得更糟,并在边缘周围产生了一个错误值的实心边框:看起来像我的@ 987654327@ 技巧设置了正确的值,但采样只是稍微偏离了一点点。这很奇怪……看到红色的碎片了吗?当物体在运动时,它们会微微地进进出出。这意味着我设置的 alpha 值与这些像素不完全匹配。
对于我的实际应用程序来说,为 alpha-index-check 获得像素完美的准确性并不重要,但这种行为并不是我所期望的。
【问题讨论】:
标签: opengl glsl textures shader