Glsl 如何确定地检测其2x2像素四边形中的着色器片段位置?
我一直在尝试利用Eric Penner的“着色器使用”中的技术 来自GPU Pro 2第VI.2章的“像素四元消息传递”。基本思想是,现代GPU在2x2片段四元组中处理片段着色器,并且您可以使用ddx()和ddy()在所有四个片段中获取某些值,只要以下条件保持不变:Glsl 如何确定地检测其2x2像素四边形中的着色器片段位置?,glsl,shader,gpu,hlsl,cg,Glsl,Shader,Gpu,Hlsl,Cg,我一直在尝试利用Eric Penner的“着色器使用”中的技术 来自GPU Pro 2第VI.2章的“像素四元消息传递”。基本思想是,现代GPU在2x2片段四元组中处理片段着色器,并且您可以使用ddx()和ddy()在所有四个片段中获取某些值,只要以下条件保持不变: 您的GPU支持高质量的衍生产品 您知道正在处理哪个片段(左上、右上、左下、右下) 这为碎片着色器优化(比如在2x2像素的四边形上分布纹理抓取)提供了很多机会,而这需要计算着色器来完成 我的问题是: 我无法确定我在处理哪个片段。理想情
谢谢:)事实证明,我问题的前提大多是错误的: 2x2片段四元组几乎总是以偶数像素开始…只要输出分辨率为偶数 如果输出分辨率是奇数(我正在使用的底层程序可能是奇数),事情可能会变得更复杂,原因很明显。我也不期望在驱动程序/GPU/等方面有任何一致性,但我目前的测试(本身可能仍然有缺陷)显示2x2像素四边形从奇数分辨率的维度上的奇数像素开始,至少在奇数维度是水平的情况下是如此 所有这些奇怪之处都掩盖了我更大的问题:我用来检测碎片在像素四元组中的位置的代码有缺陷。我通过将纹理坐标设置为在一个像素四元组内相等(设置为像素四元组中心)进行测试…或者我这么认为。但是,我基于全屏四元网格计算了屏幕坐标,其中uv贴图的+v轴指向下方。屏幕空间原点从左下角开始,因为它基于笛卡尔坐标的右上象限,我不小心忘了反转用于查找像素四元中心的uv偏移的v坐标。我的许多不确定的观察结果来自于调试和错误解释事物时没有检查我的假设,特别是结合奇怪的分辨率 这是一个令人尴尬的错误,我本应该早点发现,但我想我会详细说明这一点,作为对其他人的警告,在处理相对坐标系时,始终要仔细检查垂直轴的方向。;) 更新: 我遇到过这样一种情况,2x2像素四边形从偶数像素开始,即使分辨率是奇数。由于奇数决议下的不确定性,我不得不想出另一个解决方案:
一旦我在Github上发布了我正在使用的麻省理工学院许可代码,我将发布一个链接,并附上使用示例(很遗憾,加速比不是我所期望的,但无论如何;)。我只是在等待完成一个更大的着色器,我将随它一起上传。已经好几年了,但我不得不重新访问这个着色器进行工作,我注意到我还没有发布链接。这里是我的四像素通信代码的链接(Cg代码,但很容易转换成HLSL):另外,我应该澄清一些事情:1。当时我正在为OpenGL编写.cg着色器,这就是为什么屏幕坐标从顶部开始-