OpenGL屏幕坐标

时间:2014-03-12 20:37:52

标签: opengl vertex-shader

我可以在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才能完全填满屏幕......

1 个答案:

答案 0 :(得分:2)

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

如果要直接使用窗口空间coodrs作为顶点,可以简单地使用视口变换的反转作为投影矩阵(当使用正交投影时,剪辑空间将与规范化设备空间相同,因此你不需要关心那个。)

在NDC中,(-1,-1)是左下角的核心,(1,1)是右上角的核心,因此很容易看到你需要的只是一个量表和一个翻译,你不要&# 39;甚至还需要一个完整的矩阵,这些变换将很好地结束,因为GPU可以非常有效地处理乘法加法运算。