2014-07-01 139 views
0

我试图创建一个模型视图投影矩阵为我着色器像这样创建ModelViewProjection矩阵:我挣扎在OpenTK

我得到的矩阵相机翻译:

public Matrix4 GetMatrix() 
{ 
    return Matrix4.LookAt(Position, LookingAt, Vector3.UnitY); 
} 

Postition是相机的当前位置,LookingAt是相机的目标。

现在我assmbling为着色器中的最终矩阵和传递:

Matrix4 cameraMatrix = camera.GetMatrix(); 
Matrix4 mvprojectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI/4, 16f/9f, 1f, 30f) * cameraMatrix; 

GL.UniformMatrix4(mvprojectionMatrixAttribute, false, ref mvprojectionMatrix); 

这是顶点着色器(穿过)

[着色顶点]

#version 150 core 
in vec3 pos; 
in vec3 color; 
uniform float time; 
uniform vec3 offset; 
uniform mat4 cameraView; 
uniform mat4 projection; 


out float vTime; 
out vec3 vColor; 
out mat4 vProjection; 
void main() { 
    gl_Position = vec4(pos, 1.0); 
    vColor = color; 
    vTime = time; 
    vProjection = projection; 
} 

我将它传递给几何着色器,我使用它们来定位顶点:

void makeVertex(vec3 shift, mat4 rotation) 
{ 
    gl_Position = (gl_in[0].gl_Position + vec4(shift, 0.0) * rotation) * vProjection[0]; 
    EmitVertex(); 
} 

旋转矩阵只是顶点的局部旋转。 vProjection [0]来自顶点着色器...

不知何故,如果相机移动,东西会快速离开视锥体,但实际视图不会移动。所以我假设模型视图矩阵是错误的(不从照相机转换到世界空间)。但我不确定如何创建正确的矩阵。

任何提示?谢谢。

+0

这似乎并不合适。在你的C#代码中,你建立了一个模型视图投影矩阵,并用它来设置一个统一的值。但是,然后你的顶点着色器声明单独的'cameraView'和'projection'矩阵。哪里'cameraView'从不使用。你确定这是一组一致的代码吗? –

+0

是的,我以前都使用过,现在我只是用C#将它们相乘。所以是的,其中一个是未使用的。 – pixartist

回答

1

我把这些矩阵按错误的顺序相乘。