C++ 打开GL-如何从像素缓冲区加载纹理

C++ 打开GL-如何从像素缓冲区加载纹理,c++,opengl,textures,C++,Opengl,Textures,我想在四边形上绘制纹理。我想从像素的1D无符号字符缓冲区绑定纹理,如下所示: 每个像素由2个字节组成,这2个字节是16位灰度值 事实上,我尝试了很多东西,但在我的四元电脑上看不到任何东西: void RawImageDrawer::initializeGL() { glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST)

我想在四边形上绘制纹理。我想从像素的1D无符号字符缓冲区绑定纹理,如下所示:

每个像素由2个字节组成,这2个字节是16位灰度值

事实上,我尝试了很多东西,但在我的四元电脑上看不到任何东西:

void RawImageDrawer::initializeGL() {
  glShadeModel(GL_SMOOTH);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
  glClearDepth(1.0f); 
  glEnable(GL_DEPTH_TEST); 
  glEnable(GL_TEXTURE_2D);
  glDepthFunc((GL_LEQUAL));
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void RawImageDrawer::resizeGL(int width, int height) {
  if (height == 0)
    height = 1;
  glViewport(0, 0, width, height);
  glMatrixMode(GL_MODELVIEW);*/
  glLoadIdentity();
}

void RawImageDrawer::loadTexture() {
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);
  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_RED, 
    1024, 
    1024, 
    0, 
    GL_LUMINANCE, 
    GL_UNSIGNED_BYTE, 
    buffer //unsigned char* described up there
  );
}

void RawImageDrawer::paintGL() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity(); 
  glTranslatef(0.0f, 0.0f, 0.0f); 

  glBindTexture(GL_TEXTURE_2D, texture);

  glBegin(GL_QUADS);
    glTexCoord2i(0,0); glVertex3f(-0.5f, -0.5f, 0);
    glTexCoord2i(0,1); glVertex3f(0.5f, -0.5f, 0);
    glTexCoord2i(1,1); glVertex3f(0.5f, 0.5f, 0);
    glTexCoord2i(1,0); glVertex3f(-0.5f, 0.5f, 0);
  glEnd();
}

我还尝试将纹理\u 2D更改为纹理\u 1D,但没有更改任何内容。

由于您的缓冲区是16位灰度,您应该指定
GL\u UNSIGNED\u SHORT
而不是
GL\u UNSIGNED\u BYTE
。确保您的值分布在整个[065535]范围内,因为对于16位数据,65535是完整的亮度值


另外,
GL_RED
对于
glTexImage2D
internalFormat
参数而言,从来都不是有效的值。您应该使用
GL_R16
作为
internalFormat
参数,使用
GL_RED
作为
format
参数。

谢谢您的回答,做了这些更改,但我仍然遇到了问题。。使用TEXTURE_2D使我的程序在glTexImage2D函数调用时崩溃。使用TEXTURE_1D不会使我的程序崩溃,但不会在四边形上执行任何操作。我的uchar*数组是否需要在实际数据前后进行填充?@LaurentJerber:默认情况下,行之间的偏移量必须是四个字节的倍数,但在您发布的代码中已经是这样了。如果它仍然崩溃,那么问题一定出在您未发布的代码的其他地方。特别是看看你是如何分配缓冲区的,也许你有一个bug。