【发布时间】:2014-06-17 22:53:00
【问题描述】:
我正在尝试在着色器中上传带有未签名短裤的纹理,但它不起作用。
我尝试了以下方法:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0, GL_RED, GL_UNSIGNED_SHORT, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();
我知道我正确绑定了纹理,因为我通过使用得到了一些结果
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0,
GL_RG, GL_UNSIGNED_BYTE, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();
特别是,我在红色通道中获得了我的部分价值观。我想将纹理作为无符号字节或浮点数上传。但是,我无法正确获取 glTexImage2D 调用。此外,是否可以使用深度纹理进行类似的操作?我想对我从 kinect 获得的深度信息做一些操作并显示出来。
【问题讨论】:
-
kinect_depth的类型是什么?为什么您的第二个示例使用GL_RG而您的第一个示例使用GL_RGB? -
如果您想以无符号短裤的形式访问着色器中的数据,您需要以这种方式将其存储在纹理中,并将其指定为内部格式(第三个参数)。您可能想要使用
GL_R16UI、GL_RG16UI或GL_RGB16UI,具体取决于您拥有的频道数量。 -
GL_UNSIGNED_SHORT在您对glTexImage2D (...)的调用中没有与 GPU 如何存储您的纹理有关。这仅在 GL 读取您的图像数据时使用,因此它知道如何解释像素。GL_RGB(由于缺少大小而非常模糊)很有可能会变成 8 位无符号归一化(GL_RGB8)。 -
@ColonelThirtyTwo 第二个案例是一个黑客,以确保我正确绑定纹理。数据类型为 uint16。
标签: c opengl glsl glteximage2d