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_BYTE,即使它们的大小与您int在每个整数中仅使用一个字节的范围相同。

除此之外,您会注意到它glTexImage2D没有stride参数,与glVertexAttribPointer主要用于提供数据的大多数其他函数不同。因此,即使您的值在字节内并且这些字节是可预测的空间,OpenGL 也无法将它们分开并为您重新打包它们。

所以最简单的选择是自己做:

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

如果做不到这一点,假设您int的大小是字节的四倍,您可以将原始文件作为 RGBA 纹理上传,该纹理是实际大小的四倍,然后在着色器中将其缩小,结合.ror .as(根据您的字节序) 进入正确的输出通道。

于 2013-06-05T23:52:35.897 回答
1

由于 ubyte 和 int 的大小不同,我想您必须创建一个新的 ubyte 数组并使用 for 循环逐个元素显式转换,然后再将其传递给 OpenGL。

于 2013-06-05T23:59:59.383 回答