shader - 像素着色器中 SV_POSITION 的 z 分量
问题描述
嗨,我是 directx 的新手,在像素着色器中与 SV_POSITION 苦苦挣扎。
所以我的像素着色器正常从 SV_POSITION 输入(float4)获取输入,我只是猜测这个输入的 z 分量会给我这个着色器正在处理的像素的深度值。所以我只是做了一些简单的测试。
像素着色器
float4 main(PS_INPUT input) : SV_Target
{
float Z = input.pos.z / input.pos.w;
if (Z<0.1f)
return RED;
...//draw texture
}
事实证明,所有 obj 都显示为红色,除非我将相机真正靠近它们。与我预期的结果正好相反。
所以我只是猜测顶点着色器中SV_POSITION的输出值与像素着色器中相同语义的输入值不同???
任何意见,将不胜感激。
解决方案
您的猜测是正确的 - 像素着色器的输入与顶点着色器的输出不同。该SV_Position
值具有一些与之相关的特殊语义,可以防止这种情况发生。
在 Direct3D 11 中进行渲染时,在数据出现在屏幕上之前会发生几个管道阶段。这些阶段大多是可编程的,但有些是由系统或硬件固定的。这五个固定阶段(按出现顺序)是Input Assembler、Tesselator、Stream Output、Rasterizer和Output Merger。这五个阶段根据提供给 Direct3D 的特定信息对输入数据进行各种更改。
您的问题涉及第四阶段,Rasterizer。此阶段获取您尝试渲染的 3D 几何图形的坐标,并生成将受渲染操作影响的像素坐标。正是这些像素坐标被传递给像素着色器,着色器在每个生成的像素中运行一次。由顶点着色器创建的原始坐标已被光栅化器使用。
如果您需要将深度值传递给像素着色器,您可以通过自定义语义提供该信息,或者尝试从 value 访问它SV_Depth
。
您可以在此处找到有关管道阶段的更多信息。
推荐阅读
- scala - Swagger,如何添加文件上传
- r - 在 ggpubr - r 中将中位数更改为均值
- node.js - 如何在 Windows 中安装旧版本的节点?
- javascript - 如何用reactjs修复“预计在箭头函数中返回一个值”?
- python - TypeError:字符串索引在 Pandas 中必须是整数
- apollo - ApolloClient:在所有查询中从缓存中删除项目?
- docker - 从文件 Docker 创建卷
- c - 将 IDE 用于 CS50 问题集 1 时的错误消息
- java - 为什么使用 Spliterators 创建的流没有被并行处理?
- php - 如何解决 laravel/horizon v4.3.3 需要 ext-pcntl 问题