OpenGL屏幕布局
OpenGL screen layout
我对屏幕设置有一些问题。最初,当我画一个三角形时,x向量1会一直向右,-1会一直向左。现在我已经对它进行了调整,以适应窗口的不同纵横比。我的新问题是,如何使用于渲染二维三元图的数字与像素值一起使用。如果我的窗口是480像素宽和320像素高,我想输入这个来用三跨越屏幕
glBegin(GL_TRIANGLES);
glVertex2f(240, 320);
glVertex2f(480, 0);
glVertex2f(0, 0);
glEnd();
但是它现在看起来像这个
glBegin(GL_TRIANGLES);
glVertex2f(0, 1);
glVertex2f(1, -1);
glVertex2f(-1, -1);
glEnd();
有什么想法吗?
您需要使用具有正确值的函数glViewport和glOrtho。基本上,glViewport
设置了窗口中能够使用OpenGL渲染3D图形的部分。glOrtho
使用OpenGL的坐标在窗口的该部分建立坐标系。所以对于你的任务,你需要知道确切的宽度和高度的窗口。如果你说他们分别是480和320,那么你需要打电话给
glViewport(0, 0, 480, 320)
// or: glViewport ( 0,0,w,h)
在某个地方,可能在您的SizeChanging处理程序中(如果您使用WINAPI,则为WM_SIZE消息)
接下来,在建立OpenGL的场景时,需要指定OpenGL的坐标。对于正交投影,它们将与窗口的尺寸相同,因此
glOrtho(-240, 240, -160, 160, -100, 100)
// or: glOrtho ( -w/2, w/2, -h/2, h/2, -100, 100 );
对你的顾客来说是可行的。这里并不是说我使用的深度是200(z从-100到100)。接下来,在渲染例程中,您可以绘制三角形
由于第二段代码适用于您,我假设您的变换矩阵都是同一矩阵,或者您有一个绕过它们的着色器。此外,您的视口将覆盖整个窗口。
通常,如果视口从(x0,y0
)开始,大小为W
x H
,则提供给glVertex2f
的标准化坐标(x,y
)将转换为(vx,vy
),如下所示:
vx = x0 + (x * .5f + .5f) * W
vy = y0 + (y * .5f + .5f) * H
如果你想使用像素坐标,你可以使用功能
void vertex2(int x, int y)
{
float vx = (float(x) + .5f) / 480.f;
float vy = (float(y) + .5f) / 320.f;
glVertex3f(vx, vy, -1.f);
}
-1 z值是最接近查看器的深度。这是否定的,因为z被认为是在转换后反映的(在您的情况下是同一性)。添加.5f
是因为光栅化器将像素视为1x1四边形,并评估该四边形中间三角形的覆盖范围。
- 如何使用C/C++在MacOSX中获得键盘布局
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 布局兼容类型的并集
- Qt自定义QPush按钮未显示在布局上
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- Winapi:屏幕截图未显示在窗口中
- 如何在快板的屏幕中显示子位图的绘制?
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 调整布局上的 QGraphicsView 小部件的大小
- 按回车键后输出屏幕关闭
- 要在屏幕上绘制一些小瓷砖,我应该使用 QQuickItem 还是 QQuickPaintedItem?
- SFML 向下移动时如何围绕屏幕中心旋转?
- 截取屏幕截图后程序卡住
- 如何在qt中将对象添加到现有布局中?--已解决
- 将布局映射到内存地址
- OpenGL屏幕布局
- 可以为屏幕键盘获得物理键盘布局