0

設定

私は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-methodsもロードされるため、使用されるすべてのメソッドがサポートされます。


フォーム表示:

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);
    }
}

もちろん、シェーダーの作成は機能しており、上記のようなタイプを使用します。

結論

私が直面した問題について、これ以上言うことはないと思います。glGenBuffersゼロをglGenTextures返すと私は理由がわかりません。セットアップは私がすでに使用した他のもののようです。

もちろん、モデルをレンダリングしていないときはウィンドウが青い背景で表示され、を使用してもエラーは発生しませんglGetError

4

1 に答える 1

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配列に属性を追加します。

于 2012-10-05T16:03:46.577 に答える