openGL - 正交投影矩阵

时间:2016-02-26 04:21:25

标签: c++ opengl

我对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必须是负面的,因为它会显示出一些奇怪的原因。我斜纹现在正确显示在屏幕上但由于某种原因它在原点对面的两侧有间隙,为什么会这样?即使镜头位置和目标的一小部分移动也会导致所有这一切消失,所以我不认为这会是问题所在。

Pixel Art Representation !!

OOOO !!
OOOO!
OOOO!
!!!!!!!!!!!!!!

新代码

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等) 。还有另一种方法可以将它存储为unsigned int。 (我意识到这有点偏离主题,但任何帮助将不胜感激)

1 个答案:

答案 0 :(得分:0)

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

相关问题