openGL - 正交投影矩阵

Posted

技术标签:

【中文标题】openGL - 正交投影矩阵【英文标题】:openGL - orthogonal projection matrix 【发布时间】:2016-02-26 04:21:24 【问题描述】:

我对 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);

我的 vbo:

    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 等)。有没有另一种方法可以将它存储为无符号整数。 (我意识到这有点偏离主题,但我们将不胜感激)

【问题讨论】:

哪个 OpenGL?可编程管道(桌面或 ES 上的 2.0;任何 Web GL)还是旧的固定管道?你在用glPushMatrix之类的东西吗?另外:无论如何,您提供的所有坐标都将是浮点数,这只是范围的问题。 不,我正在为矩阵使用顶点着色器和 glm 我的深度坐标在 0 和这个项目的最大 unsigned int 之间,所以我想知道如何绘制它,过去我能做到的唯一方法是将其更改为浮动-1 和 1,但这不方便且耗时,因为我希望能够绘制数百万个点。 @Dast99:如果您添加了显示您当前如何绘制内容的源代码,这将非常有帮助。仅显示设置转换矩阵制服的代码几乎没有帮助。 对不起,我不能做到这一点,我会尽快,基本上我将 vbo 映射到客户端(实际上是 cuda)设置值然后使用 glDrawArrays(GL_POINTS,.. .) 将它们绘制到屏幕上。 【参考方案1】:

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

【讨论】:

以上是关于openGL - 正交投影矩阵的主要内容,如果未能解决你的问题,请参考以下文章

openGL - 正交投影矩阵

OpenGL中的正交投影矩阵问题

OpenGL 3+,具有定向光的正交投影

使用 GLM 正交投影矩阵将三角形顶点放在错误的位置

OpenGL ES 学习 -- 正交投影

没有 OpenGL 的重复 OpenGL 正交投影行为