2014-03-12 218 views
0

我可以在openGL中成功处理屏幕上的3d对象。OpenGL屏幕坐标

要添加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完全填满屏幕...

+0

如果你想用二维绘制东西,那么在透视投影中使用正交投影是非常有用的。 – user3256930

回答

2

gl_Position输出的顶点着色器的不期望clip space坐标,不是窗口的空间。剪辑空间坐标将被最终转换为正常的设备空间,并最终使用视口变换转换为窗口空间坐标。

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

在NDC中,(-1,-1)是左下角的核心,而(1,1)是右上角的,因此很容易看出您需要的是规模和翻译,您不要甚至不需要一个完整的矩阵,这些转换将很好地结束,因为GPU可以非常有效地处理乘加操作。

+0

我可以使用任何工作的坐标系统。所以要确认如果我使用剪辑空间-1,-1到1,1它应该工作?什么是NDC?我正在使用opengl es(电话) – AndrewStone

+0

嗯...没有工作。 – AndrewStone

+0

@ArewrewStone:你究竟做了什么没有奏效。使用(-1,-1,z,1)(以[-1,1]中的z作为剪辑空间坐标)将映射到左下角(实际上,_pixel_的外角,而不仅仅是中心您选择的视口的角点像素)。 – derhass