OpenTK - 模型视图投影问题

Posted

技术标签:

【中文标题】OpenTK - 模型视图投影问题【英文标题】:OpenTK - Model view projection problems 【发布时间】:2015-07-03 17:16:59 【问题描述】:

我一直在关注C++ OpenGL Matrices Tutorial 并尝试将其转换为 C# OpenTK,但没有使用 MVP 矩阵,我在屏幕上绘制了一个红色三角形,但每当我尝试使用它时,我什么都没有绘制或至少没有看到无论我尝试将相机放在哪里,都在绘制任何东西。

下面有代码sn-ps但是可以查看整个source code here

这是构建 MVP 矩阵的 C# 代码

/Attempt to build our model view projection matrix

//We use an Identity matrix for the model
Matrix4 _model = Matrix4.Identity;

Matrix4 _projection = Matrix4.CreatePerspectiveFieldOfView(1.0f, 4.0f / 3.0f, 0.1f, 100.0f);

//Camera will be as 4,3,3 looking at origin, and set up direction to 1
Matrix4 _view = Matrix4.LookAt(new Vector3(4,3,3), new Vector3(0,0,0), new Vector3(0,1,0));

//combine into our model view projection
Matrix4 _model_view_projection = _projection * _view * _model;

然后我们把这个矩阵传给顶点着色器,vPosition元素是从C#代码传过来的vec3个顶点

#version 330

uniform mat4 viewProjection;

in vec3 vPosition;

void main()

    //This line doesn't work
    gl_Position = viewProjection * vec4(vPosition, 1);

    //This line works
    //gl_Position = vec4(vPosition, 1);

【问题讨论】:

如何将矩阵传递给着色器?有时最好将它们一个接一个地传递并在顶点着色器中组合它们 你的view Matrix的角度是1,你可以设置在45到60之间 @lolio 会尝试的。此外,fov 参数以弧度为单位,因此 1.0f 大约为 60 度 【参考方案1】:

代码错误:

Matrix4 _model_view_projection = _projection * _view * _model;

必须是:

Matrix4 _model_view_projection = _model * _view * _projection;
// For OpenTK, Pencil.Gaming ...

那是因为 OpenTK 使用行优先矩阵(它们是转置的)。在 C# 中,您必须以这种方式乘以矩阵(而不是在着色器中)。

【讨论】:

以上是关于OpenTK - 模型视图投影问题的主要内容,如果未能解决你的问题,请参考以下文章

现代 OpenGL 投影视图模型转换不起作用

OpenGL:光照模型视图投影变换

用于将匿名类型投影到视图模型上的 Automapper 查询

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵

WebGL或OpenGL关于模型视图投影变换的设置技巧

模型视图投影 - 如何在世界中移动对象