glGenBuffers和glGenTextures总是返回0

时间:2012-10-04 17:04:18

标签: c# opengl

设置

我正在使用System.Windows.Forms.Form作为窗口来源。 构造

FormBorderStyle = FormBorderStyle.None;
WindowState = FormWindowState.Maximized;

表单的负载:

_Device = new Device(this, DeviceConfiguration.SelectConfiguration(Bits.Eight, Bits.Eight, Bits.Eight, Bits.Eight, Bits.Twentyfour, Bits.Eight, true, true), 1024, 768);
Debug.WriteLine(GL.GetString(GL.GL_EXTENSIONS));

base.OnLoad(e);

在加载方法中,选择了设备配置,这实际上是有效的。像GL.GetString(GL.GL_EXTENSIONS)之类的通话正在发挥作用。所有gl方法都被加载,因此支持所有使用的方法。


形式示出的:

Application.Initialize(this);
RenderSettings = new RenderSettings(this);

Debug.WriteLine("After setup render settings: " + GL.GetErrorDescription());

_Textures[0] = Resources.LoadTexture("Resources\\Buttons\\btn_big_bg_normal.dds");
_Textures[1] = Resources.LoadTexture("Resources\\Buttons\\btn_big_bg_normal.dds");


base.OnShown(e);

_IsShown = true;

Application.Initialize(this)初始化使用的框架(由我编写),并且还初始化默认着色器,它正在工作,模型不起作用。 这会导致稍后渲染失败,因为返回的句柄无效。

框架

我有一个自己的OpenGL包装器,它包含所有参数的枚举,无需多次查看OpenGL参考就可以进行开发。例如方法glGenBuffers

[MethodGL]
public delegate void glGenBuffers(Int32 count, ArrayBufferHandle[] buffers);

ArrayBufferHandle定义:

/// <summary>
/// Represents a handle to a buffer
/// </summary>
[StructLayout(LayoutKind.Explicit, Size = 4)]
[ComVisible(true)]
public struct ArrayBufferHandle
{
    [FieldOffset(0)]
    UInt32 Handle;
    /// <summary>
    /// Determines if the buffer is valid
    /// </summary>
    public Boolean IsValid { get { return Handle > 0; } }
    /// <summary>
    /// Retrieves the default array buffer
    /// <br>which is used to reset bindings</br>
    /// </summary>
    public static ArrayBufferHandle Default { get { return new ArrayBufferHandle(); } }
    /// <summary>
    /// Retrieves the string representation of the current object
    /// </summary>
    /// <returns>The current object represented as string</returns>
    public override String ToString()
    {
        return String.Format("[ArrayBufferHandle Handle:{0} Valid:{1}]", Handle, IsValid);
    }
}

当然,着色器创建正在运行,并使用如上所示的类型。

结论

我认为我不会对我面临的问题说些什么。 glGenBuffersglGenTextures返回零,我不知道为什么。设置看起来像我已经使用过的其他设置。

当然,在不渲染任何模型时窗口显示为蓝色背景,使用glGetError时我没有任何错误。

1 个答案:

答案 0 :(得分:0)

首先:感谢MārtiņšMožeiko带领我走向了正确的方向。

事实证明,方法void glGenBuffer(Int32 count, UInt32[] buffers)正在运行,但方法void glGenBuffers(Int32 count, ArrayBufferHandle[] buffers)却没有。两者都有一个传递的4字节/元素数组,但.NET似乎处理它们不同。解决方案很简单:

void glGenBuffers(Int32 count, [Out]ArrayBufferHandle[] buffers)

向数组添加Out属性。