OpenGL没有用户点击的渲染点

时间:2017-02-28 04:50:09

标签: c++ opengl

我的应用程序的基本前提(截至目前)仅用于呈现用户点击的点。这是我的代码(在片段中 - 如果有帮助的话,我会尝试添加我的“思路”):

首先,用户点击他想要显示点的任何地方(在窗口初始化之后):

  void mouseButtonCallback(GLFWwindow* _window, int button, int action, int mods)
{
     switch (button)
   {
    case GLFW_MOUSE_BUTTON_LEFT:
    if (action == GLFW_RELEASE)
    {
        if (transitionalFlag == false) {


            glfwGetCursorPos(window, &x, &y);
            setPositionVector(x, y);
            flag = true;
        }
        else { //please ignore the else for the moment seeing as I can't get the first one to work

            glfwGetCursorPos(window, &x, &y);
            setPositionVector(x, y);
            pointsClickedByUserTranslational.push_back(positionsClickedByUser);
        }

    }

  }
}

所以每当我必须走第一行时,我会转换为过渡并将光标的x和y带入setPositionVector(这是以下方法):

void setPositionVector(double xpos, double ypos) {
    if (transitionalFlag == false) {
         positionsClickedByUser = windowToWorldCoords(glm::vec2(x, y));
         vectorsToFloat(positionsClickedByUser);
         updatePointsVBO();
}
   else {
       positionsClickedByUser = glm::vec3(xpos, ypos, 0);
       vectorsToFloat(positionsClickedByUser);
       updatePointsVBO();
  }
}

此方法接受x和y并首先将其更改为我的世界坐标(这是以下方法):

glm::vec3 windowToWorldCoords(const glm::vec2 p)
{
// Get window dimensions
   int w, h;
   glfwGetWindowSize(window, &w, &h);

// Transform to camera coordinates; we assume the z-coordinate to be 0
   const GLfloat cameraX = 2 * p.x / w - 1;
   const GLfloat cameraY = -(2 * p.y / h - 1);

// Transform to world coordinates by inverting the transformation matrix
   return glm::vec3(glm::inverse(transformationMatrix) * glm::vec4(cameraX,         cameraY, 0.0f, 1.0f));
}    

返回一个vec3然后我在这个方法中改为float:

 void vectorsToFloat(glm::vec3 vector) {

      vectorOfVertices.push_back(vector.x);
      vectorOfVertices.push_back(vector.y);
       vectorOfVertices.push_back(vector.z);

}

之后,我有了我的updateVBO()方法,正如它所说的那样,每次用户点击屏幕时都会更新我的VBO

void  updatePointsVBO()
{
    glBindVertexArray(pointsVAO);
    glBindBuffer(GL_ARRAY_BUFFER, pointsVBO);
    glBufferData(GL_ARRAY_BUFFER, 0, nullptr, GL_STATIC_DRAW);
    if (vectorOfVertices.size() > 0)
    {
       glBufferData(GL_ARRAY_BUFFER, sizeof(vectorOfVertices[0]) *      vectorOfVertices.size(), &vectorOfVertices[0], GL_STATIC_DRAW);

   }

  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
  glEnableVertexAttribArray(0);

  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindVertexArray(0);
}

所有这一切都是按照这个顺序完成的(用户点击 - >获取光标pos - >设置我的位置Vector - >然后最后用新信息更新我的VBO)

在我的主循环中,我得到了这个:

int main() {


   initializeOpenGL();

   shader_program = shadersInitialization("vertex.shader", "fragment.shader");

   //linke your matrices to your shader
   modelMatrixLocation = glGetUniformLocation(shader_program, "modelMatrix");
   projectionMatrixLocation = glGetUniformLocation(shader_program, "projectionMatrix");
   viewMatrixLocation = glGetUniformLocation(shader_program, "viewMatrix");




   //Function allows to set camera to look at object
   modelMatrix = glm::lookAt(cameraPos, cameraTarget, upVector);


  while (!glfwWindowShouldClose(window)) {

      glfwPollEvents();



       glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


       glUseProgram(shader_program);
       //projMatrix = glm::perspective(45.0f, (float)WIDTH/(float)HEIGHT, 0.1f, 1000.0f );


       glUniformMatrix4fv(modelMatrixLocation, 1, GL_FALSE, glm::value_ptr(modelMatrix));
       glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, glm::value_ptr(viewMatrix));
       glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, glm::value_ptr(projectionMatrix));

      draw();


      glfwSwapBuffers(window);
   }


   glDeleteVertexArrays(1, &pointsVAO);
   glDeleteBuffers(1, &pointsVBO);

   glfwTerminate();
   return 0;
}

我的绘画功能:

 void draw()
{
  glGenBuffers(1, &pointsVBO);
  glGenVertexArrays(1, &pointsVAO);

  glBindVertexArray(pointsVAO);
  glDrawArrays(GL_POINTS, 0, vectorOfVertices.size());
 }

我没有收到任何错误,只是一个空白的屏幕。另外,我很确定我的代码现在的编码方式不是最优的,尽管我只是想了解如何使这些点出现。任何会有所帮助。

谢谢!

注意:如果你要对这篇文章进行投票,请说明我做错了所以我的下一个问题更适合所需的风格。

1 个答案:

答案 0 :(得分:1)

在draw方法的每次调用中都生成并使用了一个新的缓冲区。由于您将数据上传到这样的缓冲区,然后将其丢弃并生成新的缓冲区,您始终使用空缓冲区绘制。您应该将对象生成移动到渲染循环之外。

此外,目前只有最后pointsVBOpointsVAO被删除。您应该阅读一些关于哪些函数属于初始化代码的内容,并且应该只调用一次(如glGenVertexArraysglVertexAttribPointerglVertexAttribPointer)并且应该只调用一次,哪些函数必须是每一帧都叫。