5

我正在学习 OpenGL 环境中的纹理。我看到在将实际图像数据传递到视频内存之前,没有传统的方法来获取实际图像数据。

出于好奇,是否可以创建我自己的像素数据矩阵并用任意信息填充它,而不是实际读取位图或图像文件?

4

3 回答 3

10

我看到在将实际图像数据传递到视频内存之前,没有传统的方法来获取实际图像数据。

“常规”是什么意思?

出于好奇,是否可以创建我自己的像素数据矩阵并用任意信息填充它,而不是实际读取位图或图像文件?

看看签名,嗯,比如说 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);
}
于 2012-10-19T09:46:59.200 回答
9

OpenGL 不知道文件是什么。它不知道文件图像格式等等。它没有将文件中的内容加载到纹理中的功能。

各种像素传输函数采用指向内存(或包含内存的缓冲区对象)的指针。如何生成这些数据完全取决于您。您可以从文件加载它,从算法创建它,无论您想做什么。

于 2012-10-19T08:20:28.693 回答
0

至少在 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 )

于 2012-10-19T08:12:50.877 回答