gpt4 book ai didi

c - 应用透视矩阵时的 OpenGL 失真

转载 作者:行者123 更新时间:2023-11-30 17:15:54 24 4
gpt4 key购买 nike

我有一个程序,可以简单地绘制一个立方体。当应用旋转缩放等变换时,程序可以工作。当我尝试应用任何透视矩阵(例如透视、平截头体或正交)时,立方体会以未定义的方式变得非常扭曲。我感到困惑的是为什么该程序在使用其他转换时工作正常,但在应用任何类型的透视 View 时却崩溃了。

此外,当我在 glUniformMatrix4fv 中将 GL_TRUE 参数更改为 GL_FALSE 时,立方体停止在屏幕上移动,但仍然有奇怪的扭曲。这里是显示功能。仅应用透视就会产生相同的扭曲。

void display()
{
vec4 e2 = { 0.0, 0.0, 1.0, 0.0};
vec4 at = { 0.0, 0.0, 0.0, 0.0 };
vec4 up = { 0.0, 1.0, 0.0, 0.0 };

mat4 rx = RotateX(theta);
mat4 ry = RotateY(theta);
mat4 ps = Perspective(zoom*45.0, aspect, 0.5, 10.0);
mat4 rxry = multiplymat4(rx, ry);

mat4 mv = LookAt(e2, at, up);
glUniformMatrix4fv( ModelView, 1, GL_TRUE, &mv.m[0][0] );

mat4 p = multiplymat4(rxry,ps);
glUniformMatrix4fv(projection, 1, GL_TRUE, &p.m[0][0]);
}

我不相信它在我的透视函数中,因为正交和平截头体做同样的事情,但透视代码在下面。

mat4 Perspective(float fovy, float aspect, float zNear, float zFar)
{
float top = tan(fovy*DegreesToRadians/2) * zNear;
float right = top * aspect;

mat4 c = ZERO_MATRIX;
c.m[0][0] = zNear/right;
c.m[1][1] = zNear/top;
c.m[2][2] = -(zFar + zNear)/(zFar - zNear);
c.m[2][3] = -2.0*zFar*zNear/(zFar - zNear);
c.m[3][2] = -1.0;
c.m[3][3] = 0.0;
return c;
}

和顶点着色器

#version 120

attribute vec4 vPosition;
attribute vec4 vColor;
varying vec4 color;

uniform mat4 ModelView;
uniform mat4 projection;

void
main()
{
gl_Position = projection*ModelView*vPosition/vPosition.w;
color = vec4( vColor);
}

最佳答案

我可以发现两个地方我认为是错误的。

1)您将透视矩阵与旋转矩阵相乘。为什么?如果你想做相机移动,它们必须在lookAt矩阵中完成。因此,我建议使用这个简单的代码:

mat4 ps = Perspective(zoom*45.0, aspect, 0.5, 10.0);
glUniformMatrix4fv(projection, 1, GL_TRUE, &ps.m[0][0]);

2)透视划分是由GPU自动完成的,这样看来,你的顶点着色器也是错误的:

gl_Position = projection*ModelView*vPosition;
color = vec4( vColor);

关于c - 应用透视矩阵时的 OpenGL 失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com