0

以下はテクスチャとして機能します...

GLubyte bytePix[4 * 3] ={
  255, 0, 0, //red
  0, 255, 0, //green
  0, 0, 255,  //blue
  255, 255, 0  //yellow
};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pixelWidth, pixelHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, pbytePix);

問題は、BMP を int[] として渡しているため、このようなものがもっと必要になることです...

int bytePix[4 * 3] ={
      255, 0, 0, //red
      0, 255, 0, //green
      0, 0, 255,  //blue
      255, 255, 0  //yellow
};

しかし、これは同じ結果を示していません。

私の質問は、後者を GLubtye[] またはその他の認識可能な形式に変換する方法です。

4

2 に答える 2

1

あなたのプラットフォームでは、 はsizeof(int)明らかに と等しくありませんsizeof(GLubyte)。当面の質問は、なぜ使用しているのかということだと思いますint。0 ~ 255 の範囲の値のみを格納している場合は、スペースを大量に浪費する可能性があります。

各整数内でバイトの範囲のみを使用しているため、それらがあなたと同じサイズであっても、GL_INTorGL_UNSIGNED_INTの代わりに使用することはできません。GL_UNSIGNED_BYTEint

それはさておき、主にデータを提供するために存在する他のほとんどの関数とは異なり、glTexImage2Dにはパラメーターがないことに気付くでしょう。したがって、値がバイト内にあり、それらのバイトが予測可能なスペースで離れていても、OpenGL はそれらを引き離して再パックすることはできません。strideglVertexAttribPointer

したがって、最も簡単なオプションは自分で行うことです。

void glTexImage2DWithStride(..., GLsizei stride, ...)
{
    // the following is written to assume GL_RGB; adapt as necessary
    GLubyte *byteBuffer = (GLubyte *)malloc(width * height * 3);

    for(int c = 0; c < width * height * 3; c++)
        byteBuffer[c] = originalBuffer[c];

    glTexImage2D(..., byteBuffer, ...);

    free(byteBuffer);
}

それに失敗すると、あなたがバイトの 4 倍の大きさであると仮定するintと、オリジナルを実際のサイズの 4 倍の大きさの RGBA テクスチャとしてアップロードし、シェーダーで縮小して、.rまたはを組み合わせ.aます (エンディアンに従って) 正しい出力チャネルに挿入します。

于 2013-06-05T23:52:35.897 に答える