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

nie*_*ula 4 opengl textures

我正在学习OpenGL环境中的纹理.我发现在将实际图像数据传递给视频内存之前,没有传统的方法可以获取实际图像数据.

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

Nic*_*las 9

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

各种像素传递函数将指针指向存储器(或包含存储器的缓冲对象).如何生成数据完全取决于您.您可以从文件加载它,从算法创建它,无论您想做什么.


dat*_*olf 9

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

你对"传统"是什么意思?

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

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

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

最后一个参数将指针指向某个内存.在将内存传递给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);
}
Run Code Online (Sandbox Code Playgroud)