投影和视图矩阵
Projection and View Matrix
编辑
我已经确定这不是我的矩阵的问题,而是glGetUniformLocation
没有找到请求的变量
编辑2
我已经纠正了上面的错误,单位矩阵现在可以工作了。所以现在我想,这个错误又回到了我的矩阵上。
我在得到正确的投影和视图矩阵时遇到了一些问题。我对照了几个例子,不知道哪里出了问题。除非禁用着色器,否则我在屏幕上看不到任何内容。
我这样计算模型矩阵:
float aspect = (float)width / std::max(1.0f, (float)height);
float top = tan(Maths::toRadian(FOV * 0.5f)) * near;
float bottom = -top;
float right = top * aspect;
float left = -right;
projMatrix.reset();
projMatrix(0, 0) = (2.0f * near) / (right - left);
projMatrix(1, 1) = (2.0f * near) / (top - bottom);
projMatrix(2, 2) = -(far + near) / (far - near);
projMatrix(2, 3) = -1.0f;
projMatrix(3, 2) = (-2.0f * far * near) / (far - near);
projMatrix(3, 3) = 0.0f;
我这样计算视图矩阵:
Camera::Camera(const Maths::Vector3& pos)
: position(pos), target(0.0f, 0.0f, 0.0f), up(0.0f, 1.0f, 0.0f) {
target.normalize();
up.normalize();
}
Maths::Matrix4 Camera::getMatrix() const {
Maths::Matrix4 mat;
Maths::Vector3 z = position - target;
Maths::Vector3 x = Maths::crossProduct(up, z);
Maths::Vector3 y = Maths::crossProduct(z, x);
z.normalize();
x.normalize();
mat(0, 0) = x.x; mat(0, 1) = y.x; mat(0, 2) = y.z;
mat(1, 0) = x.y; mat(1, 1) = y.y; mat(1, 2) = y.z;
mat(2, 0) = x.z; mat(1, 2) = y.z; mat(2, 2) = y.z;
mat(3, 0) = -Maths::dotProduct(x, position);
mat(3, 1) = -Maths::dotProduct(y, position);
mat(3, 2) = -Maths::dotProduct(z, position);
return mat;
}
然后我把它们传递到着色器中,最终是这样的:
glGetUniformLocation(viewMatrix, "view");
glGetUniformLocation(projMatrix, "proj");
glUniformMatrix4fv(viewMatrix, 1, GL_TRUE, view.asArray());
glUniformMatrix4fv(projMatrix, 1, GL_TRUE, proj.asArray());
最后是我的着色器:
顶点:
#version 330
layout (location = 0) in vec3 position;
uniform mat4 view;
uniform mat4 proj;
void main()
{
gl_Position = proj * view * vec4(position, 1.0);
};
片段:
#version 330
out vec4 gl_FragColor;
void main()
{
gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
为了涵盖所有的基础,这里是我计算点积和叉积的方法:
float dotProduct(const Vector3& a, const Vector3& b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
Vector3 crossProduct(const Vector3& a, const Vector3& b) {
return Vector3(a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.z);
}
编辑:
查看你的源代码,我注意到你是voxel.draw((函数是在你禁用attrib数组后调用的,这意味着当你调用该函数时,没有任何东西被发送到你的着色器。如果我没有错的话,应该是这样的:
void Engine::draw() {
light.enable();
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, triangle);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, 3);
//glDisableVertexAttribArray(0); disable attrib array before calling draw?
voxel.draw();
glDisableVertexAttribArray(0); //NOW disable it, so your draw function works!
}
另一个注意事项:我知道你不想使用glm,但我强烈建议你使用它
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
//projection matrix
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
//camera matrix
glm::mat4 View = glm::lookAt(
glm::vec3(4,3,3), //camera is at (4,3,3) in world
glm::vec3(0,0,0), //look at origin
glm::vec3(0,1,0) //head up
);
宾果!我的视图矩阵是错误的。注意我是如何将最后一列all设置为y.z
的。。。
这是我修改后的视图矩阵:
Maths::Matrix4 mat;
Maths::Vector3 z = Maths::normalize(target - position);
Maths::Vector3 x = Maths::normalize(Maths::crossProduct(z, up));
Maths::Vector3 y = Maths::crossProduct(x, z);
mat(0, 0) = x.x; mat(0, 1) = y.x; mat(0, 2) = -z.x;
mat(1, 0) = x.y; mat(1, 1) = y.y; mat(1, 2) = -z.y;
mat(2, 0) = x.z; mat(1, 2) = y.z; mat(2, 2) = -z.z;
mat(3, 0) = -Maths::dotProduct(x, position);
mat(3, 1) = -Maths::dotProduct(y, position);
mat(3, 2) = Maths::dotProduct(z, position);
相关文章:
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 视图中的参数推导失败:take_while
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在另一个类视图中添加最多2个图表的正确方法是什么
- OpenVR:向视图方向移动
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- 将所选值(通过视图)从 boost::multi_array 复制到另一个数组 (C++)
- 如何在不使用滚动条的情况下使视图更改
- 应用投影矩阵后对象消失
- 列表视图更改选择颜色
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 将世界、视图和投影矩阵传递到 Direct3D 中的着色器
- 无法正确生成视图投影矩阵
- QMatrix4x4 模型视图投影 OpenGL 无法获取要渲染的场景
- 投影和视图矩阵
- 设置opengl视图和投影转换
- 我需要澄清"Spaces"的概念(世界空间,视图空间,投影空间,局部空间和屏幕空间)(c ++,direct3d 11)
- 如何在现代OpenGL中管理模型、视图和投影矩阵
- 模型视图-在Opengl2.x[C++]中获取模型视图和投影矩阵
- 现代OpenGL投影视图模型转换不起作用