Когда я вызываю "glXChooseVisual" (он же GLX.ChooseVisual в C #), он возвращает нулевой IntPtr.
Что меня смущает, так это когда я собираю NeHe lesson02, в основном используя тот же код, который работает (единственное отличие, которое пишется на C).
Также, когда я захожу в код из OpenTK и обнаруживаю, когда он вызывает «glXChooseVisual», он возвращает действительный визуальный ptr, и я пока не могу найти ничего, что мне не хватает.
Также, что меня беспокоит, так это то, что я работал в прошлом, как год назад. Причина, по которой я это делаю, заключается в кроссплатформенном API, который не ограничивается только OpenGL, поэтому любая помощь будет отличной.
Я пробовал все это на [Ubuntu 11.10 Nvidia 5700] и [Fedora 16 Nvidia 6100], и они оба провалились. Вы можете скопировать и вставить этот код в консольное приложение Mono-C #, чтобы проверить его.
using System;
using System.Runtime.InteropServices;
namespace TestGL
{
static class GLX
{
[DllImport("libX11", EntryPoint = "XOpenDisplay", ExactSpelling = true)]
public static extern IntPtr XOpenDisplay(IntPtr display_name);
[DllImport("libX11", EntryPoint = "XDefaultScreen", ExactSpelling = true)]
public static extern int XDefaultScreen(IntPtr dpy);
[DllImport("libGL", EntryPoint = "glXChooseVisual", ExactSpelling = true)]
public static extern IntPtr ChooseVisual(IntPtr dpy, int screen, int[] attribList);
public const int RGBA = 4;
public const int DOUBLEBUFFER =5;
public const int RED_SIZE = 8;
public const int GREEN_SIZE = 9;
public const int BLUE_SIZE = 10;
public const int ALPHA_SIZE = 11;
public const int DEPTH_SIZE = 12;
public const int None = 0x8000;
}
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hope this works!");
//Get DC
IntPtr dc = GLX.XOpenDisplay(new IntPtr(0));
int screen = GLX.XDefaultScreen(dc);
//Set BackBuffer format
int[] attrListDbl =
{
GLX.RGBA,
GLX.DOUBLEBUFFER,
GLX.RED_SIZE, 8,
GLX.GREEN_SIZE, 8,
GLX.BLUE_SIZE, 8,
GLX.DEPTH_SIZE, 16,
0
};
IntPtr visual = GLX.ChooseVisual(dc, screen, attrListDbl);
if (visual == IntPtr.Zero)
{
int[] attrListSgl =
{
GLX.RGBA,
GLX.RED_SIZE, 8,
GLX.GREEN_SIZE, 8,
GLX.BLUE_SIZE, 8,
GLX.DEPTH_SIZE, 16,
0
};
visual = GLX.ChooseVisual(dc, screen, attrListSgl);
}
if (visual == IntPtr.Zero)
{
Console.WriteLine("Failed to get visual.");
}
else
{
Console.WriteLine("Yahoo.");
}
//ctx = GLX.CreateContext(dc, visual, new IntPtr(0), true);
//GLX.MakeCurrent(dc, handle, ctx);
}
}
}