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 - 正交投影矩阵的主要内容,如果未能解决你的问题,请参考以下文章