如何在顶点着色器中获得未转换的位置?

时间:2014-07-30 21:00:59

标签: opengl glsl

我正在使用以下方法将变换应用于我的模型:

glMatrixMode(GL_MODELVIEW);
glMultTransposeMatrixd(transform, 0);

这是我的顶点着色器:

#version 110

varying vec4 pos;
varying vec3 N;
varying vec4 vertColor;

void main(void)  
{    
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
    pos = gl_Vertex;
    N = normalize(gl_NormalMatrix * gl_Normal);
    vertColor = gl_Color;
}

如何在没有应用模型矩阵的情况下获得该位置?也就是说,好像我没有首先应用glMultTransposeMatrixd(transform, 0)

我已经尝试gl_Vertex * gl_ModelViewMatrixInverse - 我不确定这是否有效 - 但它没有给出正确结果。

2 个答案:

答案 0 :(得分:3)

如果您想要在对其应用变换之前/之后的坐标,请不要对其应用变换。在你的情况下,未转换的顶点数据只是gl_Vertex

答案 1 :(得分:2)

如果没有该矩阵的逆矩阵,则无法撤消矩阵乘法。由于您的变换矩阵已与相机矩阵合并,gl_ModelViewMatrixInverse不是transform的倒数。正如其他人所提到的,获得未转换位置的最佳方法就是根本不进行转换。

只需将transform作为制服传递给着色器,然后根据需要应用它。实际上,现代OpenGL不再使用内置矩阵,而是要求您使用制服专门传递自己的矩阵。

此外,您可以考虑将相机和投影变换合并为一个矩阵,并使用第二个进行模型变换。然后,仅应用模型变换矩阵可以获得世界位置,并且应用两者都可以获得屏幕位置。