OpenGL ES 2.0将int []转换为GLubyte []

时间:2013-06-05 21:02:01

标签: opengl-es

以下作为纹理......

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

问题是我作为int []传递给我的BMP所以我需要更像这样的东西......

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

但这并没有显示相同的结果。

我的问题是如何将后者转换为GLubtye []或其他一些可识别的格式。

2 个答案:

答案 0 :(得分:1)

在您的平台上,sizeof(int)显然不等于sizeof(GLubyte)。我想最直接的问题是 - 你为什么要使用int?如果您只存储0-255范围内的值,则可能只会浪费大量空间。

您不能仅使用GL_INTGL_UNSIGNED_INT代替GL_UNSIGNED_BYTE,即使它们与您int的尺寸相同,因为您只使用glTexImage2D每个整数内的字节范围。

除此之外,您会注意到stride没有glVertexAttribPointer参数,与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); } 不同,而且大多数其他功能主要用于提供数据。因此,即使你的值在字节之内,并且这些字节是可预测的空间,OpenGL也不能将它们分开并为你重新打包它们。

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

int

如果失败,假设您的.r是一个字节的四倍,您可以将原始内容上传为RGBA纹理,其大小是实际大小的四倍,然后在着色器中将其缩小,合并将.a或{{1}} s(根据您的字节顺序)放入正确的输出渠道。

答案 1 :(得分:1)

由于ubyte和int的大小不同,我猜你必须创建一个新的ubyte数组,并在将它传递给OpenGL之前用for循环显式转换元素。