Opengl / SDL2关于nivida卡上访问错误的帮助

时间:2018-01-26 00:04:33

标签: c# opengl

所以我的代码是

GLCore.TriFromRect(rect1,ref cords);
GLCore.glVertexPointer(2,GlEnums.GL_FLOAT,0,cords);
GLCore.glDrawArrays(GlEnums.GL_TRIANGLES,0,6);

用于绘制矩形。 我正在编写一个opengl版本2.0,这是我想要支持的版本。 我上面的当前代码适用于使用外部英特尔,ati和板载intel或ati图形卡的任何其他计算机。

glDrawArrays函数如何让我对nivida卡片进行访问冲突,例如我的朋友titan和我从2005年开始的430 geforce。

有什么想法吗?

感谢您的时间。 SDL2设置为请求2.0 GL上下文 和nivida和intel卡返回2.1,ati返回2.0

GLEnv设置

//Enable Double Buffering. 1=True 0=False
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_DOUBLEBUFFER,1);
//Set the Major and Minor Requested version to 2.0
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MAJOR_VERSION,2);
SDL.SDL_GL_SetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_MINOR_VERSION,0);
//Keep the GL Context;
GLContext=SDL.SDL_GL_CreateContext(window);
if (GLContext==IntPtr.Zero){
    throw new Exception("Failed to create GL context:"+SDL.SDL_GetError());
}else{
    //Keep a copy of the window handle
    GLWindow=window;
    //Show the window.
    SDL.SDL_ShowWindow(window);
    //Load GL Functions
    Load_GlFunctions();
    //Set Clear Color [Currently White]
    glClearColor(1f,1f,1f,1f);
    //Flush the graphic buffer.
    Flush();
    //Present the buffer.
    Present();
    //Tell the FrontEnd we are ready.
    GLInit=true;
}

编辑GLCore的重要部分

internal delegate void Gl3i1p(int i1,int i2,int i3,IntPtr val);
internal delegate void Gl3i1fa(int i1,int i2,int i3,float[] val);
internal delegate void Gl3i(int i1,int i2,int i3);
internal delegate void Gl1i(int i1);
internal static float[255] cords = new float[255];

public static void Flush() {
    GLCore.glClear(GlEnums.GL_COLOR_BUFFER_BIT | GlEnums.GL_DEPTH_BUFFER_BIT);
}

public static void Present() {
    SDL.SDL_GL_SwapWindow(GLCore.GLWindow);
}

internal static T LoadUnmanagedFunction<T>(IntPtr functionpointer){
    var val = Marshal.GetDelegateForFunctionPointer(functionpointer,typeof(T));
    return (T)Convert.ChangeType(val,typeof(T));
}

internal static Gl1i glEnableClientState;
internal static Gl3i1fa glVertexPointer;
internal static Gl3i1fa glTexCoordPointer;
internal static Gl3i glDrawArrays;

private static void Load_GlFunctions(){
    glEnableClientState = LoadUnmanagedFunction<Gl1i>(SDL.SDL_GL_GetProcAddress("glEnableClientState"));
    glVertexPointer = LoadUnmanagedFunction<Gl3i1fa>(SDL.SDL_GL_GetProcAddress("glVertexPointer"));
    glTexCoordPointer = LoadUnmanagedFunction<Gl3i1fa>(SDL.SDL_GL_GetProcAddress("glTexCoordPointer"));
    glDrawArrays = LoadUnmanagedFunction<Gl3i>(SDL.SDL_GL_GetProcAddress("glDrawArrays"));
}

internal static void TranglesFromRect(float x1,float y1,float x2,float y2,ref float[] fill){
    float tmp=0f;
    if (x1 > x2) {
        tmp = x2;
        x2  = x1;
        x1  = tmp;
    }
    if (y1 > y2) {
        tmp = y2;
        y2  = y1;
        y1  = tmp;
    }
    fill[0]  = x1;
    fill[1]  = y1;
    fill[2]  = x2;
    fill[3]  = y1;
    fill[4]  = x2;
    fill[5]  = y2;
    fill[6]  = x2;
    fill[7]  = y2;
    fill[8]  = x1;
    fill[9]  = y2;
    fill[10] = x1;
    fill[11] = y1;
}

2 个答案:

答案 0 :(得分:0)

自OpenGL 1.1以来

glDrawArrays()存在。此版本受Windows,支持,无需获取指向它的函数指针。只需将其用作您首选语言的任何其他常用功能即可。

实际上,尝试使用&#34; GetProcAddress()&#34;来获取函数指针。方法可能会返回一个空指针,一旦被调用就会导致崩溃。

就是说,一些图形驱动程序可能会为每个OGL 1.1命令公开一个函数指针。因此,使用GetProcAddress可能会返回一个有效的指针。这就解释了为什么你的代码在某些机器上工作而在其他机器中不工作。

我的建议是:不要为OGL 1.1中存在的命令使用函数指针

答案 1 :(得分:0)

我终于修好了。

在nivida上,2D系统在我的卡上不起作用。将我的三角形传递给3D,用0代替Z修复我的问题并将我的glDrawArrays更改为使用3代替 2

感谢那些试图提供帮助的人。