0
colors = surface->format->BytesPerPixel;
if (colors == 4) {   // alpha
    if (surface->format->Rmask == 0x000000ff)
        texture_format = GL_RGBA;
    else
        texture_format = GL_BGRA;
} else {             // no alpha
    if (surface->format->Rmask == 0x000000ff)
        format = GL_RGB;
    else
        format = GL_BGR;
}

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, colors, surface->w, surface->h, 0,
                    texture_format, GL_UNSIGNED_BYTE, surface->pixels);

StackOverflowで見つけたコードをValaに変換しようとしています。ただし、glGenTexturesで問題が発生しています。

最初の部分は単純でした:

    int texture_format;
    uchar colors = screen.format.BytesPerPixel;
    if (colors == 4) {
        if (screen.format.Rmask == 0x000000ff) {
            texture_format = GL_RGBA;
        } else {
            texture_format = GL_BGRA;
        }
    } else {
        if (screen.format.Rmask == 0x000000ff) {
            texture_format = GL_RGB;
        } else {
            texture_format = GL_BGR;
        }
    }

ただし、これは変換方法がわかりません。glGenTextures(1、&texture);

私は試した:

    GL.GLuint[] texture = {};
    glGenTextures (1, texture);

私が得た:

.vala:46.27-46.33: error: Argument 2: Cannot pass value to reference or output parameter

私も試しました:

GL.GLuint[] texture = {};
glGenTextures (1, out texture);

私が得た:

ERROR:valaccodearraymodule.c:1183:vala_ccode_array_module_real_get_array_length_cvalue: assertion failed: (_tmp48_)

私は試した:

glGenTextures (1, &texture);

私が得た:

.vala:46.27-46.34: error: Argument 2: Cannot pass value to reference or output parameter

他にも似たようなことをいろいろ試しましたが、何かアイデアはありますか?

4

1 に答える 1

2

バインディングが間違っているように聞こえます。glGenTexturesのマニュアルページに基づくと、Valaバインディングは次のようになります。

public static void glGenTextures ([CCode (array_length_pos = 0.9)] GL.GLuint[] textures);

それを呼び出す適切な方法は次のようになります。

GL.GLuint[] textures = new GL.GLuint[1];
glGenTextures (textures);
// your texture is textures[0]

もちろん、これは、単一のテクスチャが必要な場合に見ているユースケースにはあまり適していませんが、それほど大きな問題ではありません。問題は、ヒープに配列を割り当てる必要があることです...これがパフォーマンスに敏感なコード領域であることは間違いないので、おそらく気にしないでしょうが、いつでも別のバージョンを作成できます。

[CCode (cname = "glGenTextures")]
public static void glGenTexture (GL.GLsizei n, out GL.GLuint texture);

その後、あなたはそれを呼び出すことができます

GL.GLuint texture;
glGenTexture (1, out texture);

このバージョンを使用して単一のテクスチャを生成することしかできないという事実にもかかわらず、最初の引数を手動で渡す必要があります。

于 2012-09-17T23:37:21.003 に答える