2016-02-26 130 views
0

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

EDIT 2

有了一些摆弄我发现的cols必须为阴性一些奇怪的原因之前,它会显示。我现在斜纹正确地显示在屏幕上,但由于某种原因,他在与原点相对的两侧有一个间隙,为什么?即使在相机位置和目标的一小步移动,它的所有消失,所以我不认为这会是问题。

像素艺术表现形式!

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个像素,我无法摆脱的,任何帮助一个缺口在此将不胜感激,但感谢您的兴趣。

UPDATE

根据要求我的拉伸代码

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。 (我知道这是主题稍微偏离,但任何帮助,将不胜感激)

+0

哪个OpenGL?可编程管道(桌面或ES上的2.0;任何Web GL)还是旧的固定管道?你是否在使用诸如'glPushMatrix'之类的东西?另外:您提供的所有坐标都将浮动,无论如何,这只是一个范围问题。 – Tommy

+0

不,我使用顶点着色器和glm作为矩阵 –

+0

我的深度坐标是介于0和最大无符号整数这个项目,所以我想知道如何得到这个画,我能做到这一点的唯一途径是将其更改为在-1和1之间浮动,但这样不方便且耗时,因为我希望能够绘制数百万个点。 –

回答

0

该问题似乎与cols变量,它需要倒转工作,否则它是在屏幕之外。