0

OpenTK 1.0を使用して独自のレンダリング エンジンを作成しており、現在テクスチャを実装しようとしていますが、問題があります。私はこのチュートリアルに従っており、チェッカーボードのようなテクスチャの代わりにこれを取得ます。

http://www.opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_readsによると、このような問題はおそらくアラインメントの誤りなどが原因であるとのことですが、これらすべてを確認したところ、すべて問題ないようです。

また、派手な forloop-construct によって実際に生成されるテクスチャ データを確認しましたが、すべて問題ありません。

プラットフォーム: Win7 64 ビット、OpenTK 1.0 Nightly ビルド (2013 年 3 月 15 日以降)、Nvidia GEFORCE 610M-2GB

これはこれまでの私のコードです。現時点では、テクスチャを使用して 2 つのクワッドをレンダリングし、カメラの位置を設定するなど、他に何もしていません。

テクスチャローダー:

private int LoadTexture(string file_name)
{
    int width = 64, height = 64;
    byte[][][] checkImage = new byte[height][][];
    for(int a = 0; a < checkImage.Length; a++) {
        checkImage[a] = new byte[width][];
        for(int b = 0; b < checkImage[a].Length; b++) {
            checkImage[a][b] = new byte[4];
        }
    }

    int i, j, c;
    for(i = 0; i < height; i++) {
        for(j = 0; j < width; j++) {
            c = (((i & 0x8) == 0 ? 1 : 0) ^ ((j & 0x8) == 0 ? 1 : 0)) * 255;
            checkImage[i][j][0] = (byte) c;
            checkImage[i][j][1] = (byte) c;
            checkImage[i][j][2] = (byte) c;
            checkImage[i][j][3] = (byte) 255;
        }
    }

    GL.Enable(EnableCap.Texture2D);

    //Create a texture object and specify a texture for that object.
    int texture_handle = GL.GenTexture();
    GL.BindTexture(TextureTarget.Texture2D, texture_handle);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Nearest);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMinFilter.Nearest);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.ClampToEdge);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.ClampToEdge);

    GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
    GL.TexImage2D(TextureTarget.Texture2D,
        0, PixelInternalFormat.Rgba8,
        width, height, 0,
        OpenTK.Graphics.OpenGL.PixelFormat.Rgba,
        PixelType.UnsignedByte,
        ref checkImage[0][0][0]);

    GL.Disable(EnableCap.Texture2D);

    return texture_handle;
}

レンダリング:

OnRenderFrame(FrameEventArgs e) {
    <...>
    GL.Enable(EnableCap.Texture2D);
    GL.BindTexture(TextureTarget.Texture2D, texture_handle);
    GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (int) TextureEnvMode.Decal);

    GL.Begin(BeginMode.Quads);
    GL.TexCoord2(0.0, 0.0);
    GL.Vertex3(-2.0, -1.0, 0.0);
    GL.TexCoord2(0.0, 1.0);
    GL.Vertex3(-2.0, 1.0, 0.0);
    GL.TexCoord2(1.0, 1.0);
    GL.Vertex3(0.0, 1.0, 0.0);
    GL.TexCoord2(1.0, 0.0);
    GL.Vertex3(0.0, -1.0, 0.0);

    GL.TexCoord2(0.0, 0.0);
    GL.Vertex3(1.0, -1.0, 0.0);
    GL.TexCoord2(0.0, 1.0);
    GL.Vertex3(1.0, 1.0, 0.0);
    GL.TexCoord2(1.0, 1.0);
    GL.Vertex3(2.41421, 1.0, -1.41421);
    GL.TexCoord2(1.0, 0.0);
    GL.Vertex3(2.41421, -1.0, -1.41421);
    GL.End();

    GL.Disable(EnableCap.Texture2D);
    <...>
}
4

1 に答える 1

2

問題は、バイト配列を teximage2d 関数に渡す方法に関係していると思います。openTK のドキュメントでは、データは IntPtr の形式である必要があると指定されています。この投稿のコードを使用して、バイトの 1 次元配列へのポインターを取得できますが、それが 3 次元配列で機能するかどうかは完全にはわかりません。(ランタイムがメモリを割り当てる方法に依存すると思います)。うまくいかない場合は、3D 配列を 1 次元のバイト配列に変換してみてください。

于 2013-07-23T13:10:02.043 に答える