我有一个包含像素值的属性。我想用这个属性值来偏移我的gl_vertex。
问题在于我的gl_vertex是以世界单位为单位的,而偏移\属性是以像素为单位的。
如果我将屏幕大小作为uniform发送,并将像素转换为-1到1的值,然后添加到最终的gl_Position中,我就可以做到这一点。但是我现在不想管理屏幕大小事件,并且每次绘制时都要发送它,每个着色器都要这样做。
有没有办法通过矩阵计算或它们的逆来实现呢?
为了简化问题,我想将gl_Position设置为像素50,50。
vec4 myPixelValue = vec4(50,50,1,1);
gl_Position = <Something> * myPixelValue;
---- 补充 ----
在理解无法在不向着色器发送窗口大小的情况下完成此操作后,我决定发送大小。我创建了以下顶点着色器代码:
attribute vec2 spriteOffset;
uniform vec2 screenSize;
void main()
{
vec2 screenConvert = vec2(2.0 / screenSize.x, -2.0 / screenSize.y);
vec2 convertedPix = spriteOffset * screenConvert;
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex) + vec4(convertedPix, 0.0, 0.0);
}
这段代码仅适用于2D(正交投影),而不适用于3D。现在我遇到了问题。我知道我需要考虑Z值,但不知道该如何处理。
有人可以帮忙吗?
vec4 clip = gl_ModelViewProjectionMatrix * gl_Vertex; gl_Position = vec4(clip.xyz / clip.w + vec3(convertexPix, 0.0), 1.0);
- keltar