在OpenGL中将四边形分层

时间:2015-03-11 04:58:05

标签: c++ opengl 2d-games

我使用C ++使用OpenGL创建基于2D平铺的战术RPG,并且我在拼贴我的平铺/四边形时遇到了困难。我想能够说一个树纹理四边形,图像是树与周围透明的alpha层,在一个不透明的草纹理四边形。我需要让树出现在草的顶部,草通过树图像的alpha层显示。

到目前为止,我一直在搞乱glDisable(GL_DEPTH_TEST),glEnable(GL_BLEND)和glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)但到目前为止还没有运气。我最终得到了一棵黑色背景上的树,而不是草瓦。有人能指出我正确的方向吗?

下面是我的渲染函数和初始化函数,它们可能是最相关的。

void View::initialize() {
  updateProjection(window);
  glDisable(GL_DEPTH_TEST);
  glClearColor(0.0, 0.0, 0.0, 1.0);
  camera = new Camera(Vector3(-1, -3, 25), Vector3(-1, -3, 0), Vector3(0, 1, 0));
  loadImages();
  initShaders();

  //needed for transparency?
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

void View::render(World* worldTemp)
{
  Matrix4 mvpMatrix, viewMatrix, modelMatrix;
  Matrix4 XAxisRotationMatrix, YAxisRotationMatrix, ZAxisRotationMatrix;

  input->handleInput(camera, worldTemp->getPlayer());

  worldTemp->timerTick();
  worldTemp->clearFog();

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            // Clear Screen and Depth Buffer

  XAxisRotationMatrix = Matrix4::IDENTITY;
  YAxisRotationMatrix = Matrix4::IDENTITY;
  ZAxisRotationMatrix = Matrix4::IDENTITY;
  XAxisRotationMatrix.rotate(Vector3(1.0, 0.0, 0.0), XAxisRotationAngle);
  YAxisRotationMatrix.rotate(Vector3(0.0, 1.0, 0.0), YAxisRotationAngle);
  ZAxisRotationMatrix.rotate(Vector3(0.0, 0.0, 1.0), ZAxisRotationAngle);

  viewMatrix = camera->getViewMatrix();

  modelMatrix = translationMatrix(Vector3(-4, 2, 0));
  mvpMatrix = projectionMatrix * viewMatrix * modelMatrix;

  //Spit out the map
  for (int i = 0; i < 100; i++){
      for (int j = 0; j < 100; j++){
          for (int t = 0; t < 5; t++){
              if (worldTemp->getTile(i, j)->isOccupied() == true) {
                  if (worldTemp->getTile(i, j)->getOccupyingEntityIndexed(t)->getFog()){
                    worldTemp->getTile(i, j)->getOccupyingEntityIndexed(t)->getEntityQuad()->render_self(mvpMatrix, true);
                  }
                  else{
                    worldTemp->getTile(i, j)->getOccupyingEntityIndexed(t)->getEntityQuad()->render_self(mvpMatrix);
                  }
              }
          }
      }
  }

  //Place the player
  worldTemp->getPlayer()->getEntityQuad()->render_self(mvpMatrix);
  renderEnemies();

  glutSwapBuffers(); //works with GL_DOUBLE. use glFlush(); instead, if using GL_SINGLE
}

1 个答案:

答案 0 :(得分:0)

基本上,在2D游戏中通过渲染调用的顺序完成分层。如果您想在图层B的顶部放置图层A,则应首先渲染图层B,然后再渲染图层A.

您正在使用的

混合功能应取决于图像的纹理格式。 alpha有两种常见的格式:

  1. 预乘alpha
  2. Straight alpha

    有关此内容的更多信息:https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre

  3. opengl es2 premultiplied vs straight alpha + blending

      

    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);是预乘的alpha,如果按原样使用颜色,它应该可以正常工作。 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);是直接的alpha。