Opengl es 在半渲染正交场景的顶部将OpenGL切换到透视模式?

Opengl es 在半渲染正交场景的顶部将OpenGL切换到透视模式?,opengl-es,orthographic,perspectivecamera,Opengl Es,Orthographic,Perspectivecamera,我们有一个主要以正交模式运行的2D游戏,但其中一部分显示了在其他2D对象之间渲染的3d模型。如何切换到透视模式,渲染该模型,然后切换回以正交模式渲染其他对象 如果你能展示它是如何在OpenGL ES中实现的,那就太好了。我认为这并不是一个明确的问题。你想看更多的风景吗?或者您希望拥有2D背景、3D游戏对象、2D gui。如果你想要这个,那么: 渲染全屏背景 将视口设置为position=obj.pos-obj.size/2,size=obj.size,渲染对象 渲染二维图形用户界面 还是你想

我们有一个主要以正交模式运行的2D游戏,但其中一部分显示了在其他2D对象之间渲染的3d模型。如何切换到透视模式,渲染该模型,然后切换回以正交模式渲染其他对象


如果你能展示它是如何在OpenGL ES中实现的,那就太好了。

我认为这并不是一个明确的问题。你想看更多的风景吗?或者您希望拥有2D背景、3D游戏对象、2D gui。如果你想要这个,那么:

  • 渲染全屏背景
  • 将视口设置为position=obj.pos-obj.size/2,size=obj.size,渲染对象
  • 渲染二维图形用户界面
还是你想要别的

编辑:

下面是一些小代码:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,w,0,h,near,far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(pos.x,...);

DrawQuads();

//if you want to keep your previus matrix
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(90,width/(float)height,0.001,1000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(pos.x,...);
glRotate(-45.0f,1,0,0);
glTranslate(0,0,distance from object);
glRotate(90.0f,1,0,0);
// or use gluLookAt
// 0,0,1 - if you want have z as up in view
// 0,1,0 - for y
//gluLookAt(pos.x,pos.y,pos.z,cam.x,cam.y,cam.z,0,0,1);

glScale(object.width/model.width,...);
DrawModel();

// Restore old ortho
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
“就这么做吧”

  • 将投影矩阵设置为正交
  • 设置二维对象的模型视图
  • 渲染2D对象
  • 将投影矩阵设置为“投影”
  • 设置三维对象的模型视图
  • 渲染3D对象
。。。这种情况可能会再次发生

  • 和交换缓冲区

如果你像看上去那样知道对象的顺序,你也可以清除每个渲染之间的z缓冲区。

我同意前面的文章,我认为更一般的情况类似于3D对象和2D gui。 只是为了再次强调。:)


我正在以正交模式在背景(精灵)中渲染几个四边形。在此之后,我需要以透视模式渲染三维模型,然后,我需要在前景中渲染更多精灵。这不仅仅是一个全屏背景。这有意义吗?感谢您花时间制作代码示例。我不知道你可以推投影矩阵。旋转/平移代码也很有用。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 45.0f, (GLfloat)s_width/(GLfloat)s_height, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// render 3D object
glUseProgram(modelProgram);
glSetUniformMat(glGetUniformLocation(model.mvp, "mvp"), mvpMat);
glBindVertexArray(model.vao);
glDrawArrays(GL_TRIANGLES, 0, model.size);
glUseProgram(0);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// draw GUI
renderGUI();