是否可以“手动”为OpenGL纹理使用创建图像数据?

时间:2012-10-19 08:07:29

标签: opengl textures

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

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

3 个答案:

答案 0 :(得分:9)

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

各种pixel transfer functions获取指向内存的指针(或buffer objects containing memory)。如何生成数据完全取决于您。您可以从文件加载它,从算法创建它,无论您想做什么。

答案 1 :(得分:9)

  

我发现在将实际图像数据传递到视频内存之前,没有传统方法可以获取实际图像数据。

“常规”是什么意思?

  

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

好好看看签名,嗯,让我们说glTexImage2D:

   void glTexImage2D( GLenum target,
                      GLint level,
                      GLint internalformat,
                      GLsizei width,
                      GLsizei height,
                      GLint border,
                      GLenum format,
                      GLenum type,
                      const GLvoid *pixels )

最后一个参数将指针指向某个内存。在将内存传递给OpenGL之前,必须由 填充此内存。通过读取和解码图像文件或通过程序生成图像来填充该存储器。事实上,官方OpenGL编程指南(红皮书)中的大多数示例都是在程序上生成图像数据。例如,这是来自第1版的第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);
}

答案 2 :(得分: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 )