C++ openGL-正交投影矩阵

C++ openGL-正交投影矩阵,c++,opengl,C++,Opengl,我对openGL非常陌生,我正在做一个小型项目,在这个项目中我尝试使用深度缓冲区。我到了向屏幕展示的阶段。但是我想把它画成屏幕坐标,而不是转换成浮点数。我在某个地方读到,我需要使用投影矩阵。我已经找了好几年,测试了很多不同的选项,但我似乎没有找到正确的答案 有人能给我指出一个有用的资源,或者解释一下我将如何做这件事吗 编辑 目前,我的矩阵如下所示: projectionMat = glm::ortho(0.0f, (float)_cols, 0.0f, (float)_rows, 0.0f, (

我对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));
我的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(我意识到这有点离题,但请提供任何帮助)

问题似乎与cols变量有关,需要将其反转才能工作,否则它将不在屏幕上。

哪个OpenGL?可编程管道(桌面或ES上的2.0;任何web GL)还是旧的固定管道?您使用的是
glPushMatrix
?另外:不管怎样,你提供的所有坐标都将是浮动的,这只是一个范围问题。不,我正在使用顶点着色器和glm,因为matrixMy深度坐标在0和最大无符号整数之间,所以我想知道如何绘制它,过去我唯一能做的方法是将其更改为-1和1之间的浮动,但这既不方便又耗时,因为我希望能够画出数百万点。@Dast99:如果您添加了显示当前如何绘制内容的源代码,这将非常有帮助。仅显示用于设置转换矩阵的代码几乎没有帮助。很抱歉,我现在不能尽快完成,基本上我正在将vbo映射到客户端(实际上是cuda)设置值,然后使用glDrawArrays(GL_点,…)将它们绘制到屏幕上。
    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);