【问题标题】:HLSL Set pixel position in pixel shader to control where the pixel will end up in the textureHLSL 在像素着色器中设置像素位置以控制像素在纹理中的最终位置
【发布时间】:2013-07-26 23:43:57
【问题描述】:

如何在 PixelShaderFunction HLSL 中手动设置像素在纹理中的最终位置?理想情况下,我希望 GPU 遵循下一个逻辑:

  1. 不按特定顺序逐个写入像素。意思是每当第一个像素出现时,将其写入纹理的左上角。将第二个写在第一个的右侧,将第三个写在第一个的右侧,依此类推。
  2. 当您到达行尾时 - 转到下一行。
  3. 当您到达纹理的末端时 - 删除所有剩余的像素。

谢谢。

我觉得我可以通过在顶点着色器级别手动计算我的像素所需的位置来做到这一点。如果我能更好地理解像素定位的工作原理,我也许可以把它拉出来。如果我有一个渲染目标 2000*4。如何在顶点着色器级别确保我的像素最终位于第二行?

如果我的 RenderTarget 是一个高度 = 1 的纹理,我可以不用计算位置吗?或者我是否冒着通过像素合并丢失数据的风险?我打算在屏幕上画一条长线,一条一条地画出中间的目标。

【问题讨论】:

    标签: position set shader pixel hlsl


    【解决方案1】:

    基本上你不能做你所描述的。

    在顶点着色器之后,GPU 有一组要绘制的三角形。它在渲染目标(可能是后缓冲区)上逐个像素地填充它们。作为此填充过程的一部分 - 确定每个像素的颜色 - 您的像素着色器将被调用(就像一个函数)用于填充的特定像素。此时没有“移动”输出像素的能力。

    可以做的是在从像素着色器中的纹理采样时将纹理坐标参数调整为tex2D (MSDN)。您可以应用任何有意义的functions 来实现您想要的结果。

    或者,如果变换很简单,您可以简单地在顶点数据中适当地设置纹理坐标,或者使用顶点着色器。

    【讨论】:

    • 我想要实现的是:我的通行证将返回一个巨大的数组,其中有几个重复的唯一数字,我需要在 CPU 上检索和处理。我尝试渲染成 2000x1 纹理,然后使用 RenderTarget2d.GetData() 和 foreach 循环在 CPU 上对其进行采样。它非常慢:)。所以我回避了我的问题,现在的想法是多次渲染到 1x1 纹理。在传递之间,我将在我的着色器中扩展一个参数数组以包含已经返回的数字。
    • 如果每个像素包含一个已经出现的数字,它将查询数组并剪辑自身。现在的问题是,无论我渲染什么,像素颜色都不会改变。可能是因为我在其中渲染的内容太小(我在屏幕上画一条线并沿线对场景的颜色进行采样)?这是我提出这个问题的另一个线程的链接:stackoverflow.com/questions/17888689/…
    • 听起来您确实在尝试实现“某事”,并且您已经决定了一个解决方案 - 这不一定能很好地工作 - 您正在询问如何实施该解决方案。相反,你也许应该从更高的层次开始,解释你的“东西”是什么,并寻求实现它的最佳方法。 (可能您的解决方案是正确的 - 但至少它可以为您的其他问题提供一些背景 - 如果没有该背景,这些问题会令人困惑。)
    • 否则,我只能说GetData 是一个非常慢的调用:它分配内存(快速但会触发缓慢的垃圾收集),它从 GPU 拉回数据(慢)和停止 GPU 管道(非常慢)。因此,如果您必须使用它,那么希望您不会为单像素区域重复调用它(这在您的评论中不清楚)。你最好通过一个GetData 调用来获取一个大区域。
    • 我想在GPU上实现一个像素完美的碰撞检测。我们的游戏有特定的射击机制,子弹必须击中第一个可见的物体。这些对象在 gpu 上进行了骨骼动画和蒙皮。我们已经使用我们在 cpu 上蒙皮的边界立方体实现了普通的碰撞检测系统。但我认为像素完美碰撞将是一种更好更快的方法(尤其是对艺术家而言)。这就是我想要这样做的方式: 1. 我将我的骨骼怪物绘制到一些渲染目标中,作为 ID-s(数字)。 2. 我用着色器将子弹绘制到 1x1 渲染目标中......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-12-28
    • 2022-08-23
    相关资源
    最近更新 更多