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

Opengl es OpenGL ES 2.0将int[]转换为GLubyte[],opengl-es,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

以下内容用作纹理

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[]或其他可识别的格式。

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

您不能仅使用
GL\u INT
GL\u UNSIGNED\u INT
来代替
GL\u UNSIGNED\u BYTE
,即使它们的大小与
INT
相同,因为您在每个整数中只使用一个字节的范围

除此之外,您会注意到,
glTexImage2D
没有
stride
参数,这与
glvertexattributepointer
和大多数其他主要用于提供数据的函数不同。因此,即使您的值在字节内,并且这些字节之间的间隔是可预测的,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);
}
void glTexImage2DWithStride(…,GLsizei stride,…)
{
//编写以下内容是为了假设GL_RGB;根据需要进行调整
GLubyte*byteBuffer=(GLubyte*)malloc(宽*高*3);
对于(int c=0;c

如果失败,假设你的
int
是一个字节的四倍,你可以上传原始的RGBA纹理,它是真实大小的四倍,然后在着色器中缩小它,结合
.r
.a
s(根据你的尾数)进入正确的输出通道。

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

这是一个好问题,我使用int是因为我不知道如何在Android和iOS中轻松访问bmp,所以我决定使用该设备读入并将像素数据传递到本机(OpenGL)端。如果您愿意,我们可以将其脱机;-)jni/src/game gl.c:382:5:错误:“for”循环初始声明仅在C99模式下允许jni/src/game gl.c:382:5:注意:使用选项-std=C99或-std=gnu99编译代码:**[obj/local/armeabi/objs/testand/src/game gl.o]错误1Wow人工作得很有魅力唯一的问题是翻译导致它被翻转和镜像。我想,一个出类拔萃的人可能就是OpenGL和paint程序之间的区别;OpenGL认为(0,0)是屏幕状图形纸的左下角