gpt4 book ai didi

opengl - OpenGL 是使用 Xlib 来绘制窗口和渲染事物,还是相反?

转载 作者:行者123 更新时间:2023-12-02 06:50:59 27 4
gpt4 key购买 nike

我想使用 在窗口上渲染字体和线条OpenGL Xlib ,但我想知道哪一个是“更基本的”。

使用 Xlib 接口(interface),我可以用这样的东西渲染这些东西(我发现 here ):

// gcc x_1.c -o x_1 -lX11 && ./x_1

#include <stdio.h>
#include <X11/Xlib.h>

// This program draws a red line and some text in a chosen font.
Display *display;
Window window;
XSetWindowAttributes attributes;
XGCValues gr_values;
XFontStruct *fontinfo;
GC gr_context;
Visual *visual;
int depth;
int screen;
XEvent event;
XColor color, dummy;

int main() {
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
visual = DefaultVisual(display,screen);
depth = DefaultDepth(display,screen);
attributes.background_pixel = XWhitePixel(display,screen);

window = XCreateWindow( display,XRootWindow(display,screen),
200, 200, 350, 200, 5, depth, InputOutput,
visual ,CWBackPixel, &attributes);
XSelectInput(display,window,ExposureMask | KeyPressMask) ;
fontinfo = XLoadQueryFont(display,"6x10");

XAllocNamedColor(display, DefaultColormap(display, screen),"red",
&color,&dummy);

gr_values.font = fontinfo->fid;
gr_values.foreground = color.pixel;
gr_context=XCreateGC(display,window,GCFont+GCForeground, &gr_values);
XFlush(display);
XMapWindow(display,window);
XFlush(display);

while(1){
XNextEvent(display,&event);

switch(event.type){
case Expose:
XDrawLine(display,window,gr_context,0,0, 100, 100);
XDrawString(display,window,gr_context,100,100,"hello",5);
break;
case KeyPress:
XCloseDisplay(display);
return 1;

}
}
return 0;
}

现在,我可以使用纯 OpenGL 代码完成完全相同的事情,这引发了一些问题。

OpenGL 是否使用 Xlib 来显示窗口和渲染字体/几何图元?或者是周围的其他方式?

如果我想对渲染和显示进行更多“低级”控制,我应该使用哪一个?

编辑:

我的目标应用程序是一个准系统文本编辑器,它只会呈现 位图字体 ,只有 255 种颜色,并且只进行软件渲染(即假设没有 GPU)。

我试过 开罗/潘戈 , SDL2 , GTK qt ,但与纯 Xlib 相比,它们速度慢且 react 迟钝。

最佳答案

简短回答(从使用 Xlib/XCB/GLX/OpenGL 推断)和 Youtube tutorial :

  • XlibX protocol 的高级 C 包装器(客户端)。
  • XCBX protocol 周围的低级 C 变形器(客户端)。
  • X window System作为“客户端-服务器”系统工作,其中“X 服务器”是 GPU,“X 客户端”是您的应用程序。
  • X Protocol X 客户端和 X 服务器使用它通过套接字相互发送请求/回复/错误/事件(每个 32 字节长?)。
  • GLX既是协议(protocol)扩展又是 API它将 X 窗口系统连接到 OpenGL 并允许 X 资源(例如 X 窗口或 X 像素图)用于 OpenGL 调用。
  • OpenGL是一个图形 API 将绘制/内存命令发送到 GPU。它在一个共享库中实现,通常称为 libGL.so ,在 NVIDIA 的情况下,由 NVIDIA 实现。
  • 一个 OpenGL 应用程序需要一个 X显示/连接 , 一个 X屏 , 一个 X窗口 (或 GLX 窗口 ), X 颜色图 , 一个 GLX fbconfig , 和 GLX 上下文 在您进行第一次 OpenGL 调用之前。然后在 X 窗口(或 GLX 窗口)上呈现 OpenGL 调用的结果。
  • Linux kernelDRI , DRM ,以及 KMS ,它似乎比 Xlib/XCB/GLX/OpenGL 更低级别,并且对它们完全不可见(接近 GPU 驱动程序的级别;实际上我认为 NVIDIA 驱动程序可能会绕过一大块内核基础架构?)。

  • 所以, Xlib/XCB 创建窗口 ,然后 OpenGL 向他们渲染 .
    (OpenGL 无法创建窗口。Xlib/XCB 可以渲染,但我认为它与 GPU 加速无关。)

    关于opengl - OpenGL 是使用 Xlib 来绘制窗口和渲染事物,还是相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543176/

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