TeleUSE を使用して Linux マシンで開発しています。私は自分の仕事をするためにマシンに PuTTY します。X11 転送をオンにして、Xming を実行しています。リモートで実行している場合、ウィンドウの OpenGL 部分が見えないように見えますが、優れたデモ「glxgears」はうまく機能し、表示されます。私が考えることができる唯一のことは、glwMDrawingAreaWidgetClass を介して OpenGL を実行しようとしていることですが、glxgears は新しいウィンドウですか?
コードの一部 (OpenGL 部分) を次に示します。
#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;
}
}
make_my_widget は、作成された XmFrame ウィジェットによって呼び出されます。