1

glDrawPixels()関数と混同しています。関数のシグネチャは次のようなものです。gl.glDrawPixels(int width、int height、format、type、data);

format-type-dataの一貫性を保つ方法がわかりません。たとえば、フォーマットをGL2.GL_RGBとして使用する必要があり、type = GL2.GL_DOUBLE、GL2.GL_FLOAT、GL2.GL_BYTEをそれぞれ要求しています。データはどのように見えますか?glDrawPixels()関数を呼び出す前に、Javaでデータをラップしてフォーマットするにはどうすればよいですか。

4

1 に答える 1

1

まず第一に、実際にはglDrawPixelsを使用するべきではありません。これは非常に遅い関数であり、ほとんどのOpenGL実装ではあまり最適化されていません。代わりに、テクスチャードクワッドを使用する必要があります。しかし、あなたの質問はglTexImage2Dのパラメータにも当てはまります。

では、これらのパラメーターはどういう意味ですか。glTexImage2Dの署名を見てみましょう

C SPECIFICATION
   void glTexImage2D( GLenum target,
                      GLint level,
                      GLint internalformat,
                      GLsizei width,
                      GLsizei height,
                      GLint border,
                      GLenum format,
                      GLenum type,
                      const GLvoid *pixels )
  • internalformatデータがOpenGLの内部で持つ形式を指定します。

  • formatはデータの形式であり、glDrawPixelsの同じ名前のパラメータとまったくpixels同じ意味を持ちます。基本的に、OpenGLにデータのピクセルにいくつの要素があるかを伝えますformatpixels

  • typeOpenGLに単一のピクセルを含むタイプを通知します。さて、これは重要です。

いくつかの組み合わせを見てみましょう:

フォーマット=GL_BGRA、タイプ= GL_UNSIGNED_INT_8_8_8_8

これにより、OpenGLは、ピクセルが青、緑、赤、アルファの順序で4つの要素で構成され、4つの要素すべてが32ビットの単一の符号なし整数に含まれ、それぞれ8ビットの4つのグループに分割されることを通知します。#ffffffffHTMLの色表記(たとえば書き込み用)をご存知かもしれません。これは基本的に、16進表記の32ビットunsignedintです。

32ビットの符号なし整数の配列を持つことができます

uint32_t pixels[] = {
 0xffffffff, 0x0000ffff, 0xffffffff,
 0x0000ffff, 0xffffffff, 0x0000ffff,
 0xffffffff, 0x0000ffff, 0xffffffff,
};

これは、白地に赤いダイヤモンドの3×3サイズの画像になります。

フォーマット=GL_RGB、タイプ= GL_UNSIGNED_BYTE

この場合、ピクセルには赤、緑、青の3つの要素があり、タイプには明示的なサブサイズが示されていないため、このようなタイプの各要素にはピクセルの1つのカラー要素が含まれていることをOpenGLに通知します。

私たちの赤いダイヤモンドはこのようになります

uint8_t pixels[] = {
    0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff,
    0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00,
    0xff, 0xff, 0xff, /**/ 0xff, 0x00, 0x00, /**/ 0xff, 0xff, 0xff
};

format = GL_RGBA、type = GL_FLOAT(またはGL_DOUBLE)

この場合、ピクセルの各要素は、範囲[0; 1]。ダイヤモンドは次のようになります

float pixels[] = {
    0., 1., 0.,
    1., 0., 1.,
    0., 1., 0.
};

GL_DOUBLEの場合、まったく同じように見えますが、double代わりに。が付いていfloatます。


基本的な要点を理解していただければ幸いです

于 2013-02-13T00:07:58.240 に答える