我发现在我的片段着色器中,这两个语句给出了相同的输出:
// #1
// pos is set from gl_Position in vertex shader
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0;
// #2 - equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,你能解释一下数学吗?我理解#2,这是我提出的,但在论文中看到#1.这是NDC(标准化设备坐标)计算吗?
上下文是我使用纹理坐标与FBO大小相同的视口.这一切都有效,但我想了解数学.
顶点着色器的相关部分:
attribute vec4 position;
uniform mat4 modelViewProjectionMatrix;
varying lowp vec4 vColor;
// transformed position
varying highp vec4 pos;
void main()
{
gl_Position = modelViewProjectionMatrix * position;
// for fragment shader
pos = gl_Position;
vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器的相关部分:
// transformed position - from vsh
varying highp vec4 pos;
// viewport dimensions
uniform highp vec2 uWinDims;
void main()
{
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0;
// equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;
...
}
Run Code Online (Sandbox Code Playgroud)
(pos.xy / pos.w)是标准化设备坐标(NDC)中的坐标值.每个维度中此值的范围为-1到1.
(NDC + 1.0)/2.0将范围更改(-1 to 1)为(0 to 1)(屏幕左侧为0,右侧为1,顶部/底部类似).
或者,gl_FragCoord以像素为单位给出坐标,因此它的范围是(0 to width)和(0 to height).
除以宽度和高度(uWinDims)这个值,给出在右侧的再次从0在屏幕的左侧位置,为1.
所以是的,它们似乎是等价的.
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |