![](/img/trans.png)
[英]Applying color to a OpenGL ES 2.0 Point Sprite texture in Fragment shader?
[英]Computing texture coordinates in fragment shader (iOS/OpenGL ES 2.0)
我发现在片段着色器中,这2条语句给出了相同的输出:
// #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;
如果这是正确的,请您解释一下数学吗? 我了解#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;
}
片段着色器的相关部分:
// 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;
...
}
(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给出位置。
所以是的,它们似乎是等效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.