我正在学习 OpenGL 环境中的纹理。我看到在将实际图像数据传递到视频内存之前,没有传统的方法来获取实际图像数据。
出于好奇,是否可以创建我自己的像素数据矩阵并用任意信息填充它,而不是实际读取位图或图像文件?
我看到在将实际图像数据传递到视频内存之前,没有传统的方法来获取实际图像数据。
“常规”是什么意思?
出于好奇,是否可以创建我自己的像素数据矩阵并用任意信息填充它,而不是实际读取位图或图像文件?
看看签名,嗯,比如说 glTexImage2D:
void glTexImage2D( GLenum target,
GLint level,
GLint internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels )
最后一个参数将指针指向某个内存。该内存必须由您填充,然后才能传递给 OpenGL。通过读取和解码图像文件或通过程序生成图像来填充此内存。事实上,官方 OpenGL 编程指南(红皮书)中的大多数示例都是按程序生成图像数据的。例如,这是来自第一版的第 9 章(请注意,这不是一种很好的编程风格,不应遵循):
#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLuint texName;
void makeCheckImage(void)
{
int i, j, c;
for (i = 0; i < checkImageHeight; i++) {
for (j = 0; j < checkImageWidth; j++) {
c = ((((i&0x8)==0)^((j&0x8))==0))*255;
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
}
}
void init(void)
{
/* ... */
makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,
checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
checkImage);
}
OpenGL 不知道文件是什么。它不知道文件图像格式等等。它没有将文件中的内容加载到纹理中的功能。
各种像素传输函数采用指向内存(或包含内存的缓冲区对象)的指针。如何生成这些数据完全取决于您。您可以从文件加载它,从算法创建它,无论您想做什么。
至少在 WebGL 中有。这是一个使用 32 位浮点数/像素亮度纹理的示例。(编辑:不是 8 bpp)
http://jsfiddle.net/greggman/upZ7V/
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, 宽度, 高度, 0, gl.LUMINANCE, gl.FLOAT, 像素); 其中像素是一个数组。
我敢打赌,这与 opengl 规范中的 API 完全相同:
void TexImage2D ( enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, void *data )