openGL - 正交投影矩阵

openGL - orthogonal projection matrix

本文关键字:投影 openGL      更新时间:2023-10-16

我对openGL很陌生,我正在做一个迷你项目,在那里我尝试了深度缓冲区。我到了将其显示在屏幕上的阶段。但是我想将其绘制为屏幕坐标而不是转换为浮点数。我在某处读到我需要使用投影矩阵。我已经寻找了很长时间并测试了大量不同的选项,但我似乎无法正确处理。

谁能指出我一个有用的资源或解释我将如何做到这一点?

编辑目前我的矩阵如下所示:

projectionMat = glm::ortho(0.0f, (float)_cols, 0.0f, (float)_rows, 0.0f, (float)_maxDepthVal);
projection = glGetUniformLocation(_program, "Projection");  
glUniformMatrix4fv(projection, 1, GL_FALSE, glm::value_ptr(projectionMat));

编辑 2

经过一些摆弄,我发现 cols 必须出于某种奇怪的原因为负数才能显示。我现在在屏幕上正确显示,但由于某种原因,它在原点对面的两侧周围有一个间隙,这是为什么?即使是相机位置和目标的微小移动也会导致所有目标消失,所以我认为这不是问题所在。

像素艺术表现!!

呜!!
呜呜!!
呜呜!!
!!!!!!!!!!!!!!

新代码

glm::mat4 Projection = glm::ortho(0.0f, -static_cast<float>(_cols), 0.0f, static_cast<float>(_rows), 0.0f, static_cast<float>(_maxDepthVal));
projection = glGetUniformLocation(_program, "Projection");
glm::mat4 View       = glm::lookAt(
                            glm::vec3(0.0f, 0.0f, -0.1f),
                            glm::vec3(0.0f , 0.0f, 0.0f), // and looks at the origin
                            glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                       );
// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model      = glm::mat4(1.0f);
projectionMat        = Projection * View * Model;
glUniformMatrix4fv(projection, 1, GL_FALSE, glm::value_ptr(projectionMat));

编辑 3

可以使用模型矩阵翻译它,但它周围有 5 个像素的间隙,我无法摆脱,任何帮助将不胜感激,但感谢您的兴趣。

更新

根据要求我的绘图代码

glUseProgram(_program);

glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
SDL_GL_SwapWindow(_window);
glPointSize(1);
glEnableVertexAttribArray(0);
//Insert matrix here
glVertexAttribPointer(0, 3, GL_UNSIGNED_INT, GL_FALSE, 0, 0);
glDrawArrays(GL_POINTS, 0, _dataCount)
glDisableVertexAttribArray(0);

我的虚拟电话:

    glGenBuffers(1, &_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glBufferData(GL_ARRAY_BUFFER, _dataCount * 4 * sizeof(unsigned int), NULL, GL_STATIC_DRAW);
    if(_vbo == 0 || glGetError() != GL_NO_ERROR)
    {
        _errorMessage = "VBO COULD NOT BE CREATED";
        error();
    }
    checkCudaErrors(cudaGraphicsGLRegisterBuffer(&vbo, _vbo, cudaGraphicsMapFlagsNone));
    glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(0);

我在写入时也遇到了问题,因为当它转换为浮点数(用于绘图)时,它会失去精度,因此如果我再次读出该值,它会四舍五入到最接近的因子(0、256、512 等)。有没有另一种方法可以将其存储为未签名的int.(我意识到这有点偏离主题,但任何帮助将不胜感激)

问题似乎出在 cols 变量上,它需要反转才能工作,否则它会不在屏幕上。