C++ 打开GL-如何从像素缓冲区加载纹理
我想在四边形上绘制纹理。我想从像素的1D无符号字符缓冲区绑定纹理,如下所示: 每个像素由2个字节组成,这2个字节是16位灰度值 事实上,我尝试了很多东西,但在我的四元电脑上看不到任何东西: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)
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。