Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLWMDrawingAreawigetClass是否通过X11转发可见?_Opengl_Glx_X11 Forwarding - Fatal编程技术网

Opengl GLWMDrawingAreawigetClass是否通过X11转发可见?

Opengl GLWMDrawingAreawigetClass是否通过X11转发可见?,opengl,glx,x11-forwarding,Opengl,Glx,X11 Forwarding,我正在使用TeleUSE在Linux机器上开发。我往机器上抹油灰来做我的工作。我已打开X11转发并正在运行Xming。如果我远程运行,我似乎看不到窗口的OpenGL部分,但是伟大的演示“glxgears”效果很好&是可见的。我唯一能想到的是,我正试图通过glwMDrawingAreaWidgetClass运行OpenGL,而glxgears是一个新窗口 下面是一些代码(OpenGL部分) #包括 #包括 #包括 void expose_回调(小部件w、XtPointer clientData、X

我正在使用TeleUSE在Linux机器上开发。我往机器上抹油灰来做我的工作。我已打开X11转发并正在运行Xming。如果我远程运行,我似乎看不到窗口的OpenGL部分,但是伟大的演示“glxgears”效果很好&是可见的。我唯一能想到的是,我正试图通过glwMDrawingAreaWidgetClass运行OpenGL,而glxgears是一个新窗口

下面是一些代码(OpenGL部分)

#包括
#包括
#包括
void expose_回调(小部件w、XtPointer clientData、XtPointer callData)
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
GL3F(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
GL3F(0.0,1.0,0.0);
glRectf(-0.4,-0.4,0.4,0.4);
GL3F(0.0,0.0,1.0);
glRectf(-0.3,-0.3,0.3,0.3);
glXSwapBuffers(XtDisplay(w),XtWindow(w));
}
void resize_回调(小部件w、XtPointer clientData、XtPointer callData)
{
GLWDRAwingReacallBackstruct*cbs=(GLWDRAwingReacallBackstruct*)调用数据;
glViewport(0,0,cbs->宽度,cbs->高度);
}
void make_my_小部件(小部件w){
XVisualInfo*visinfo;
显示*dpy;
int attrib[]={GLX_RGBA,GLX_DOUBLEBUFFER,GLX_RED_SIZE,1,GLX_BLUE_SIZE,1,GLX_GREEN_SIZE,1,GLX_DEPTH_SIZE,1,None};
小部件glw;
GLXContext-ctx;
dpy=XtDisplay(w);
visinfo=glXChooseVisual(dpy、DefaultScreen(dpy)、attrib);
如果(visinfo==NULL){
printf(“glxchoosevisualfailed\n”);
返回;
}
int n;
Arg-args[20];
n=0;
XtSetArg(args[n],GLwNvisualInfo,visinfo);
n++;
XtSetArg(args[n],xmnleftatachment,XmATTACH_FORM);
n++;
XtSetArg(args[n],XmNrightAttachment,xmattachment_FORM);
n++;
XtSetArg(args[n],XmNtopAttachment,xmattache_FORM);
n++;
XtSetArg(args[n],XmNbottomAttachment,xmattachment_FORM);
n++;
XtSetArg(args[n],XmNleftOffset,10);
n++;
XtSetArg(args[n],XmNrightOffset,10);
n++;
XtSetArg(args[n],XmNtopOffset,10);
n++;
XtSetArg(args[n],XmNbottomOffset,10);
n++;
glw=XtCreateWidget(“glw”,glwMDrawingAreaWidgetClass,w,args,n);
XtAddCallback(glw,GLwNresizeCallback,resize\u callback,0);
XtAddCallback(glw,GLwNexposeCallback,expose_callback,0);
XtManageChild(glw);
ctx=glXCreateContext(XtDisplay(glw),visinfo,NULL,True);
如果(ctx==NULL){
printf(“glXCreateContext失败\n”);
返回;
}
XFree(visinfo);
如果(glXMakeCurrent(XtDisplay(glw)、XtWindow(glw)、ctx)==false){
printf(“glXMakeCurrent失败\n”);
返回;
}
}

make_my_小部件在创建后会被XmFrame小部件调用

哈哈!哦,我太跛了。好了,现在可以了。我只需要使用“Xming mesa”而不是Xming。啊

到目前为止,除了glwdrawingara不适用于间接渲染这一信念之外,还没有得出任何结论。这里找到了一些很好的例子:尽管它们都不适用于Xming的PuTTY
#include <teleuse/tu_runtime.h>
#include <stdbool.h>
#include <GL/GLwMDrawA.h>

void expose_callback(Widget w, XtPointer clientData, XtPointer callData)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColor3f(1.0, 0.0, 0.0);
    glRectf(-0.5, -0.5, 0.5, 0.5);
    glColor3f(0.0, 1.0, 0.0);
    glRectf(-0.4, -0.4, 0.4, 0.4);
    glColor3f(0.0, 0.0, 1.0);
    glRectf(-0.3, -0.3, 0.3, 0.3);

    glXSwapBuffers(XtDisplay(w), XtWindow(w));
}

void resize_callback(Widget w, XtPointer clientData, XtPointer callData)
{
    GLwDrawingAreaCallbackStruct    *cbs = (GLwDrawingAreaCallbackStruct *) callData;

    glViewport(0, 0, cbs->width, cbs->height);
}

void make_my_widget(Widget w) {
    XVisualInfo *visinfo;
    Display *dpy;
    int attrib[] = {GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_DEPTH_SIZE, 1, None};
    Widget  glw;
    GLXContext  ctx;

    dpy = XtDisplay(w);
    visinfo = glXChooseVisual(dpy, DefaultScreen(dpy), attrib);
    if (visinfo == NULL) {
        printf("glXChooseVisual failed\n");
        return;
    }

    int n;
    Arg args[20];
    n = 0;
    XtSetArg(args[n], GLwNvisualInfo, visinfo);
    n++;
    XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
    n++;
    XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);
    n++;
    XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);
    n++;
    XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);
    n++;
    XtSetArg(args[n], XmNleftOffset, 10);
    n++;
    XtSetArg(args[n], XmNrightOffset, 10);
    n++;
    XtSetArg(args[n], XmNtopOffset, 10);
    n++;
    XtSetArg(args[n], XmNbottomOffset, 10);
    n++;

    glw = XtCreateWidget("glw", glwMDrawingAreaWidgetClass, w, args, n);
    XtAddCallback(glw, GLwNresizeCallback, resize_callback, 0);
    XtAddCallback(glw, GLwNexposeCallback, expose_callback, 0);
    XtManageChild(glw);

    ctx = glXCreateContext(XtDisplay(glw), visinfo, NULL, True);
    if (ctx == NULL) {
        printf("glXCreateContext failed\n");
        return;
    }
    XFree(visinfo);

    if (glXMakeCurrent(XtDisplay(glw), XtWindow(glw), ctx) == false) {
        printf("glXMakeCurrent failed\n");
        return;
    }
}