c-如何在opengl着色器中使用unsigned short



我试图在着色器中上传一个带有未签名短裤的纹理,但它不起作用。

我尝试过以下几种:

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获得的深度信息进行一些操作并将其显示出来。

glTexImage2D的参数不一致。第三个参数(GL_RGB(表示您想要一个由三个成分组成的纹理,第七个参数(GL_RED(表示您需要一个由一个成分构成的纹理。然后您的另一次尝试使用GL_RG,它建议使用2个组件。

您需要使用内部纹理格式来存储未签名的短裤,如GL_RGB16UI

如果你想要一个组件,你的调用会是这样的:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, 640, 480, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, kinect_depth);

如果你想要三个组件:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 640, 480, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, kinect_depth);

您还需要确保着色器中用于采样纹理的类型与存储在纹理中的数据类型匹配。在本例中,由于使用的2D纹理包含无符号整数值,因此采样器类型应为usampler2D,并且希望将采样操作的结果(着色器中texture()调用的结果(存储在类型为uvec4的变量中。(根据Andon的建议添加的段落(

关于glTexImage2D的格式/类型参数的更多背景信息,因为这是相当频繁误解的来源:

第三个参数(internalFormat(是OpenGL实现将存储在纹理中的数据格式(如果硬件不支持确切的格式,则至少是最接近的格式(,并且在从纹理中采样时将使用该格式。

最后3个参数(格式类型数据(属于一起格式类型描述数据中的内容,即它们描述传递到glTexImage2D调用中的数据。

保持这两种格式的匹配是个好主意。与本例一样,传入的数据是GL_UNSIGNED_SHORT,内部格式GL_R16UI包含无符号短值。在OpenGL ES中,内部格式需要与格式/类型相匹配。如果需要,完整的OpenGL会进行转换,这出于性能原因是不可取的,而且通常也不是您想要的,因为纹理中数据的精度与原始数据的精度不同。

最新更新