以下作为纹理......
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 []或其他一些可识别的格式。
答案 0 :(得分:1)
在您的平台上,sizeof(int)
显然不等于sizeof(GLubyte)
。我想最直接的问题是 - 你为什么要使用int
?如果您只存储0-255范围内的值,则可能只会浪费大量空间。
您不能仅使用GL_INT
或GL_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循环显式转换元素。