2013-07-26 58 views
1

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

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

谢谢。

我觉得我可以通过在顶点着色器级别手动计算我的像素所需的位置来做到这一点。如果我能更好地理解像素定位如何工作,我可能会将其拉出。如果我有一个渲染目标2000 * 4。我怎样才能确保在顶点着色器级别我的像素将在第二行结束?

如果我的RenderTarget是一个高度为1的纹理,那我该怎么办?或者我有通过像素合并丢失数据的风险?我计划在屏幕上划一条长长的线,逐一清除目标。

回答

0

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

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

什么你可以要做的就是调节你的像素着色器从纹理采样时,纹理坐标参数tex2DMSDN)。您可以申请任何functions以达到您想要的效果。或者,如果变换很简单,则可以在顶点数据中或使用顶点着色器来简单地设置纹理坐标。

+0

我想要实现的是:我的通行证将返回一个巨大的数组与几个唯一的数字重复反复,我需要检索和CPU上处理。我试着渲染成2000x1纹理,然后用RenderTarget2d.GetData <>()和foreach循环在CPU上采样。这非常慢:)。所以我回避了我的问题,现在的想法是多次渲染到1x1纹理。 Inbetween阶段,我将在我的着色器中扩展一个参数数组,以包含已经返回的数字。 – cubrman

+0

每个像素都会查询数组,并且如果它包含已经出现的数字,则自行裁剪。现在的问题是,像素颜色永远不会改变我呈现的内容。是否因为我把太小的内容渲染到屏幕上(我正在屏幕上绘制一条线并沿着线条对场景的颜色进行采样)?这里是链接到另一个线程,我问这个问题:http://stackoverflow.com/questions/17888689/rendering-a-line-into-a-1x1-rendertarget2d-does-not-change-the-targets-pixel -co – cubrman

+0

这听起来像是你试图实现“某些东西”,并且你已经决定了一个解决方案 - 这不一定很好 - 而且你在问如何实现这个解决方案。相反,当你应该从更高层次开始解释你的“东西”是什么,并寻求实现它的最佳方式。(可能是因为你的解决方案是正确的 - 但是至少它可以为你的其他问题提供一些背景信息 - 如果没有这个背景,这些问题会令人困惑。) –