OpenGL是使用Xlib绘制窗口和渲染对象,还是相反?

OpenGL是使用Xlib绘制窗口和渲染对象,还是相反?,opengl,graphics,fonts,x11,Opengl,Graphics,Fonts,X11,我想使用OpenGL或Xlib在窗口上渲染字体和线条,但我想知道哪个是“更基本的” 使用Xlib接口,我可以用如下方式渲染这些东西(我发现): //gcc x_1.c-o x_1-lX11&./x_1 #包括 #包括 //这个程序用选定的字体画一条红线和一些文本。 显示*显示; 窗口窗口; XSetWindowAttributes属性; xgc值gr_值; XFontStruct*fontinfo; GC gr_上下文; 视觉*视觉; 智力深度; int屏幕; XEvent事件; XColor颜

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

使用Xlib接口,我可以用如下方式渲染这些东西(我发现):

//gcc x_1.c-o x_1-lX11&./x_1
#包括
#包括
//这个程序用选定的字体画一条红线和一些文本。
显示*显示;
窗口窗口;
XSetWindowAttributes属性;
xgc值gr_值;
XFontStruct*fontinfo;
GC gr_上下文;
视觉*视觉;
智力深度;
int屏幕;
XEvent事件;
XColor颜色,虚拟;
int main(){
display=XOpenDisplay(空);
屏幕=默认屏幕(显示);
视觉=默认视觉(显示、屏幕);
深度=默认深度(显示器、屏幕);
attributes.background_pixel=XWhitePixel(显示器、屏幕);
窗口=XCreateWindow(显示,XRootWindow(显示,屏幕),
2002003502005,深度,输入输出,
视觉、像素和属性);
XSelectInput(显示、窗口、曝光蒙版|按键蒙版);
fontinfo=XLoadQueryFont(显示“6x10”);
XALLOCNAMEDCLOR(显示,默认颜色映射(显示,屏幕),“红色”,
&颜色和虚拟图形);
gr_values.font=fontinfo->fid;
gr_values.foreground=color.pixel;
gr_context=XCreateGC(显示、窗口、GCFont+gc前台和gr_值);
XFlush(显示);
XMapWindow(显示,窗口);
XFlush(显示);
而(1){
XNextEvent(显示和事件);
开关(事件类型){
案件曝光:
XDrawLine(显示,窗口,gr_上下文,0,0,100,100);
XDrawString(显示,窗口,gr_上下文,100100,“hello”,5);
打破
外壳按键:
XCloseDisplay(显示);
返回1;
}
}
返回0;
}
现在,我可以使用纯OpenGL代码完成完全相同的事情,这引发了一些问题

OpenGL是否使用Xlib显示窗口和渲染字体/几何图元?还是反过来呢

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


编辑:

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


我尝试了Cairo/Pango
SDL2GTKQt,但与纯Xlib相比,它们速度慢且无响应。

Xlib绘图命令通过网络套接字发送过时的请求。原始绘图命令已过时,例如,当前工具包不使用特定于文本的X请求。看起来(抗锯齿)XRender扩展仍在使用。X服务器可以使用它喜欢的任何方法实现请求。请参见:glamor,使用opengl实现的XRender

OpenGL同样是一个API,而不是一个特定的实现

  • 它在不依赖X11的平台上实现,包括Windows。(在这种情况下,X11作为第三方软件提供)
  • 它也在Wayland上实现,后者是Linux上X11的继承者,在其他方面与XRender没有等价物。
  • 当opengl硬件加速不可用时,opengl可能会在软件中进行渲染
这个问题没有答案,您可以很容易地构建这样一种情况:一种是两种方式都可以工作,另一种是两种方式中只有一种可用,或者两种方式都实现硬件加速而不使用另一种,等等

OpenGL提供了更大范围的GPU功能,例如着色器编程。从这个意义上讲,它允许对硬件进行更全面的控制

旁白:opengl有一个文本绘图api??我很困惑

也许这个问题的作者想要包含一个
linux
标记


快速谷歌搜索,这是我找到的最新文章。我希望有更好的地方。在

上还有一个维基百科页面警告:文本墙进来了

@Source绝地已经给出了答案,但其中有一些不准确的地方——这些不伤人,但可能令人困惑

首先,OpenGL和Xlib是相互正交的。两者都不依赖于另一个,您可以独立使用它们GLX对Xlib有一种依赖性(这就是为什么如果你想GLX,你不能完全抛弃Xlib而选择Xcb),但是这种依赖性的表面积足够小,因此你可以在大部分情况下使用Xcb,在少数需要使用GLX的部分,可以使用Xcb上的Xlib包装器。现在我在这里删除了一些首字母缩略词,让我们先对它们进行分类:

Xlib和Xcb都是实现X11协议客户端的库。从技术上讲,您可以通过实现协议“自己”与X11服务器进行对话(事实上,目前正在努力从同样用于生成Xcb代码的规范文件中自动生成Haskell代码)。X11是通过套接字传输的,因此,如果您能够以某种方式在绑定之间传输套接字和一些内部状态,那么您甚至可以混合和匹配绑定,只要您小心操作

OpenGL本身是一个纯粹的低级(它提供的基本元素:点、线和三角形的低级)绘图工具,其中没有“窗口”的概念。通过引入帧缓冲区对象,原则上您可以创建一个无头OpenGL上下文,并完全在自我管理的图像表面范围内操作。但通常(但肯定不总是)您希望图形在显示器上立即可见。这就是窗口系统界面(WSI)发挥作用的地方。OpenGL及其周围的整个支持结构非常古老,因此没有对
// 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;
}