Opengl es OpenGL正交、透视和平截头体投影
45我试图理解OpenGL在单点上的投影。我使用QGLWidget渲染上下文,使用QMatrix4x4渲染投影矩阵。这里是draw函数Opengl es OpenGL正交、透视和平截头体投影,opengl-es,qglwidget,Opengl Es,Qglwidget,45我试图理解OpenGL在单点上的投影。我使用QGLWidget渲染上下文,使用QMatrix4x4渲染投影矩阵。这里是draw函数 attribute vec4 vPosition; uniform mat4 projection; uniform mat4 modelView; void main() { gl_Position = projection* vPosition;
attribute vec4 vPosition;
uniform mat4 projection;
uniform mat4 modelView;
void main()
{
gl_Position = projection* vPosition;
}
void OpenGLView::Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram(programObject);
glViewport(0, 0, width(), height());
qreal aspect = (qreal)800 / ((qreal)600);
const qreal zNear = 3.0f, zFar = 7.0f, fov = 45.0f;
QMatrix4x4 projection;
projection.setToIdentity();
projection.ortho(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
// projection.frustum(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
// projection.perspective(fov,aspect,zNear, zFar);
position.setToIdentity();
position.translate(0.0f, 0.0f, -5.0f);
position.rotate(0,0,0, 0);
QMatrix4x4 mvpMatrix = projection * position;
for (int r=0; r<4; r++)
for (int c=0; c<4; c++)
tempMat[r][c] = mvpMatrix.constData()[ r*4 + c ];
glUniformMatrix4fv(projection, 1, GL_FALSE, (float*)&tempMat[0][0]);
//Draw point at 0,0
GLfloat f_RefPoint[2];
glUniform4f(color,1, 0,1,1);
glPointSize(15);
f_RefPoint[0] = 0;
f_RefPoint[1] = 0;
glEnableVertexAttribArray(vertexLoc);
glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, 0, 0, f_RefPoint);
glDrawArrays (GL_POINTS, 0, 1);
}
属性向量4位置;
均匀mat4投影;
统一mat4模型视图;
void main()
{
gl_位置=投影*位置;
}
void OpenGLView::Draw()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glUseProgram(programObject);
glViewport(0,0,width(),height());
qreal方面=(qreal)800/((qreal)600);
常数qreal zNear=3.0f,zFar=7.0f,fov=45.0f;
QMatrix4x4投影;
projection.setToIdentity();
投影正交(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
//平截头体(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
//投影。透视图(视野、纵横比、zNear、zFar);
position.setToIdentity();
位置。平移(0.0f,0.0f,-5.0f);
位置。旋转(0,0,0,0);
QMatrix4x4 MVP矩阵=投影*位置;
对于(int r=0;r
正交投影就是这样工作的。我建议你搜索一些关于不同投影之间差异的图像或视频
我不知道你怎么看Z坐标中的点平移,但如果你有一个正方形,它会随着平移距离的增加而变小(使用正交,它会保持不变)。这里有一个问题,因为您在使用-20.0f表示zNear时。在大多数情况下,插入到此方法中的值应使用…生成。无论如何,您将无法看到比zNear更近的任何内容,也无法看到比zFar更远的任何内容
这与平截头体相同,但已将参数作为视场、纵横比。你看不到任何东西的原因是你的zNear位于3.0f,而点的长度为.0f。通过平移点,你将能够看到它,但尝试将其平移到3.0f到7.0f(3.0f是你的zNear,7.0f是你的zFar)。替代方法是增加zFar或向后转换投影矩阵。或者,在您的情况下,我建议在投影矩阵上添加一些“注视”系统,因为它将为您提供一些易于使用的工具来操作“相机”。在大多数情况下,您可以设置您注视的点、正在注视的点和上方向向量