【问题标题】:OpenGL screen coordinatesOpenGL屏幕坐标
【发布时间】:2023-03-29 05:35:01
【问题描述】:

我可以在 openGL 中成功操作屏幕上的 3d 对象。

要添加 2d 效果,我想我可以简单地关闭顶点着色器中的矩阵乘法(或给出单位矩阵),然后我提供的“顶点”将是屏幕坐标。

但是 2 个简单的三角形拒绝显示(正方形 0,0,100,100,尝试了各种深度,但是如果我给它一个旋转矩阵,同样的代码可以正常工作。

有什么想法吗?

  static const char gVertexShader[] = 
  "attribute vec3 coord3d;\n"
  "uniform mat4 mvp;\n"
  "void main() {\n"
  "gl_Position = mvp*vec4(coord3d,1.0);\n"
  "}\n";

->

  static const char gVertexShader[] = 
  "attribute vec3 coord3d;\n"
  "uniform mat4 mvp;\n"
  "void main() {\n"
  "gl_Position = vec4(coord3d,1.0);\n"
  "}\n";

编辑:我无法使用单位矩阵作为转换来显示任何东西,但我能够使用这个来做到这一点:

  glm::mat4 view = glm::lookAt(glm::vec3(0.0, 0.0, -5), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
  glm::mat4 pers = glm::perspective(.78f, 1.0f*screenWidth/screenHeight, 0.1f, 10.0f);
  xform = pers * view * glm::mat4(1.0f);

您必须调整 -5 才能完全填满屏幕...

【问题讨论】:

  • 如果您想在 2D 中绘制某些东西,使用正交投影而不是透视投影通常很有用。

标签: opengl vertex-shader


【解决方案1】:

顶点着色器的gl_Position 输出确实需要clip space 坐标,而不是窗口空间。剪辑空间坐标将首先转换为标准化设备空间,最后使用视口转换转换为窗口空间坐标。

如果您想直接为顶点使用窗口空间坐标,您可以简单地使用视口变换的逆作为投影矩阵(当您使用正交投影时,剪辑空间将与标准化设备空间相同,所以你不需要关心这个)。

在 NDC 中,(-1, -1) 是左下方的核心,(1,1) 是右上方的核心,因此很容易看出您只需要一个比例和一个平移,您不需要'甚至不需要一个成熟的矩阵,这些转换最终会很好地作为 GPU 可以非常有效地处理的乘加运算。

【讨论】:

  • 我可以使用任何有效的坐标系统。所以要确认我是否使用剪辑空间 -1,-1 到 1,1 它应该有效吗?什么是 NDC?我正在使用opengl es(电话)
  • @AndrewStone:你到底尝试了什么没用。使用 (-1,-1,z,1) (with z in [-1,1]) 作为裁剪空间坐标将被映射到左下角(实际上是 pixel的外角>,而不仅仅是角像素的中心)您选择的视口。
  • 我试过这个。我不认为我正在更改投影矩阵等的内部 GL 设置。我将所有矩阵 xforms 放入单个矩阵乘法(现已删除)。GLfloat testSFVertices[] = { -1.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, };
  • @AndrewStone:目前尚不清楚您的代码中实际发生了什么,但转换正如我所描述的那样。
  • 我无法使用单位矩阵显示它,但可以使用此矩阵来显示:{{{ glm::mat4 view = glm::lookAt(glm::vec3( 0.0, 0.0, -5), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0)); glm::mat4 pers = glm::perspective(.78f, 1.0f*screenWidth/screenHeight, 0.1f, 10.0f); xform = pers * view * glm::mat4(1.0f); }}}
猜你喜欢
  • 2011-11-21
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
相关资源
最近更新 更多