gpt4 book ai didi

java - 从 OpenGL ES 开始。使用像素绘图

转载 作者:太空狗 更新时间:2023-10-29 15:35:18 24 4
gpt4 key购买 nike

我开始使用 java 在 android (GL10) 中学习开放式 GL,并且我按照一些教程绘制正方形、三角形等。

现在我开始画一些我的想法,但我真的对屏幕的绘图顶点感到困惑。当我使用 openGL ES 绘制内容时,我必须指定要绘制的屏幕部分以及纹理的相同部分...

所以我开始做一些测试并用这个顶点打印了一个全屏纹理:

(-1, -1, //top left
-1, 1, //bottom left
1, -1, //top right
1, 1); //bottom right

为什么是全屏? OpenGL 坐标的中心不是在左上角 (0, 0) 吗?为什么那些顶点的绘制是正确的?看起来center真的是屏幕的真正中心,宽高是从-1...1,但是我不太明白,因为我以为center是在左上角...

另一个问题...我阅读了很多使用像素打印的 C++ 代码。在使用像素的视频游戏中似乎真的很有必要,因为需要事物的确切位置,而对于 -1...1 我不能非常精确。如何使用像素而不是 -1...1?

真的很感谢,也很抱歉我的英语不好。谢谢

最佳答案

Why is this fullscreen? Isn't the center of OpenGL coordinates at top left (0, 0)? Why with that vertexs the draw is correct? It seems that the center is really the real center of the screen and the width and height is from -1...1, but I dont really understand it because I thought that the center was at the top left...

有 3 件事在一起。所谓的视口(viewport),所谓的归一化设备坐标 (NDC),以及从模型空间到眼睛空间到剪辑空间到 NDC 空间的投影。

视口(viewport)选择 NDC 范围所在的窗口部分

[-1…1]×[-1…1]

映射到。函数签名是 glViewport(x, y, width, height)。 OpenGL 假定一个坐标系,其中上升的 NDC x 坐标向右移动,上升的 NDC y 坐标上升。

因此,如果调用 glViewport(0, 0, window_width, window_height),这也是 OpenGL 上下文第一次绑定(bind)到窗口后的默认设置,NDC 坐标 (-1, -1) 将在窗口的左下角,NDC 坐标 (1,1) 将在窗口的右上角。

OpenGL 开始时所有变换都设置为恒等式,这意味着您通过的顶点坐标将直接进入 NDC 空间并像这样解释。然而,在 OpenGL 中,大部分时间您都在应用连续变换:

  • 模型 View

  • 投影

模型 View 变换用于在固定眼睛/相机(始终位于 (0,0,0))前的世界中移动。放置相机只是意味着添加整个世界的额外变换( View 变换),这与您将相机放置在世界中的方式完全相反。 固定函数 OpenGL 将其称为 MODELVIEW 矩阵如果矩阵模式已设置为 GL_MODELVIEW,则可以访问。

投影变换是一种 OpenGL 镜头。您可以使用它来设置它是广角还是小角(在透视的情况下)或长方体的边缘(正射投影)或什至不同的东西。 OpenGL 将其称为 PROJECTION 矩阵 的固定函数,如果矩阵模式已设置为 GL_PROJECTION,则会被访问。

投影基元被裁剪后,然后应用所谓的同质划分,如果应用了透视投影,这将创建实际的透视效果。

此时顶点已转换为 NDC 空间,然后如开头所述将其映射到视口(viewport)。


关于您的问题:您想要的是一个将顶点坐标 1:1 映射到视口(viewport)像素的投影。很简单:

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();

现在顶点坐标映射到视口(viewport)像素。


更新:通过三角形绘制一个全视口(viewport)纹理四边形:

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);
}

关于java - 从 OpenGL ES 开始。使用像素绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com