Fri*_*n3L 2 java android opengl-es vertex
我开始学习使用java的android(GL10)中的开放GL,我按照一些教程来绘制正方形,三角形等.
现在我开始画出一些想法,但我真的很困惑屏幕的绘图顶点.当我使用openGL ES绘制一些东西时,我必须指定我想要绘制的屏幕部分以及纹理相同的部分...
所以我开始做一些测试,然后用这个顶点打印出一个全屏纹理:
(-1, -1, //top left
-1, 1, //bottom left
1, -1, //top right
1, 1); //bottom right
Run Code Online (Sandbox Code Playgroud)
为什么这是全屏?OpenGL坐标的中心不是左上角(0,0)?为什么这个顶点的绘制是正确的?看起来中心真的是屏幕的真正中心,宽度和高度从-1 ... 1,但我真的不明白,因为我认为中心位于左上角......
另一个问题......我读了很多c ++代码,他们用像素打印.在使用像素的电子游戏中似乎非常必要,因为需要事物的确切位置,并且-1 ... 1我不能非常精确.我怎样才能使用像素而不是-1 ... 1?
非常感谢和抱歉我的英语不好.谢谢
为什么这是全屏?OpenGL坐标的中心不是左上角(0,0)?为什么这个顶点的绘制是正确的?看起来中心真的是屏幕的真正中心,宽度和高度从-1 ... 1,但我真的不明白,因为我认为中心位于左上角......
有三件事情在一起.所谓的视口,即所谓的标准化设备坐标(NDC),以及从模型空间到眼睛空间到剪辑空间到NDC空间的投影.
视口选择窗口中NDC范围的部分
[-1…1]×[-1…1]
Run Code Online (Sandbox Code Playgroud)
被映射到.功能签名是glViewport(x, y, width, height).OpenGL假设一个坐标系统,NDC x坐标上升到右边,上升的NDC y坐标上升.
因此,如果您调用glViewport(0, 0, window_width, window_height),这也是OpenGL上下文第一次绑定到窗口后的默认值,NDC坐标(-1,-1)将位于左下方,NDC坐标(1,1)位于左下方.窗户的右上角.
OpenGL首先将所有转换设置为identity,这意味着,您通过的顶点坐标将直接进入NDC空间并按此解释.但是,在OpenGL中大部分时间你都在申请连续转换:
和
模型视图变换用于在静止的眼睛/摄像机(总是位于(0,0,0))前面移动世界.放置相机只是意味着,增加了对整个世界的额外转换(视图转换),这与您将相机放置在世界中的方式完全相反.固定函数OpenGL将此称为 MODELVIEW矩阵,如果矩阵模式已设置为 GL_MODELVIEW 则访问该矩阵.
投影变换是OpenGL的一种镜头.您可以使用它来设置是宽角度还是小角度(如果是透视)或长方体(正投影)的边缘,甚至是不同的角度.固定函数OpenGL将此调用称为 PROJECTION矩阵,如果矩阵模式已设置为 GL_PROJECTION ,则访问该矩阵.
在剪切投影基元之后,如果应用透视投影,则应用所谓的均匀分割,这产生实际的透视效果.
此时,顶点已转换为NDC空间,然后如开头所述,将其映射到视口.
关于你的问题:你想要的是一个投影,它将顶点坐标1:1映射到视口像素.很容易:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if( origin_lower_left ) {
glOrtho(0, width, height, 0, -1, 1);
} else {
glOrtho(0, width, 0, height, -1, 1);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Run Code Online (Sandbox Code Playgroud)
现在顶点坐标映射到视口像素.
OpenGL-2.1和OpenGL ES-1
void fullscreenquad(int width, int height, GLuint texture)
{
GLfloat vtcs[] = {
0, 0,
1, 0,
1, 1,
0, 1
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vtcs);
glTexCoordPointer(2, GL_FLOAT, 0, vtcs);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2906 次 |
| 最近记录: |