opengl es 3.0无符号整数纹理似乎缩小了

时间:2016-10-26 12:12:02

标签: opengl-es integer textures shader

我在imx6 SOC上使用opengl es3.0,这是我的问题:

我想用整数格式渲染纹理,并在片段着色器中执行按位操作。 在执行按位操作之前,我需要以无符号整数格式获取纹理。

要做到这一点,这是我配置我的帧缓冲对象的方法:

glGenFramebuffers(1, &m_uiFrameBufferObject);
glBindFramebuffer(GL_FRAMEBUFFER, m_uiFrameBufferObject);
glGenTextures(1, &m_uiTextureFB);
glBindTexture(GL_TEXTURE_2D, m_uiTextureFB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, WIDTH, HEIGHT, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, nullptr);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_uiTextureFB, 0);

glDrawBuffers(1, attachments);    //GL_COLOR_ATTACHMENT0

然后这是用于渲染的纹理:

glGenTextures(1, &m_uiTextureId);
glBindTexture(GL_TEXTURE_2D, m_uiTextureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, WIDTH_IN, HEIGHT_IN, 0, GL_RED, GL_UNSIGNED_BYTE, cImage);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,  GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

其中cImage是一个包含垂直斜坡(0到255)的char表。

为了取回我的渲染,我使用像这样的函数glReadPixels:

glReadPixels( 0, 0, WIDTH, HEIGHT, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, (GLvoid*)Image );

然后这是我的片段着色器:

#version 300 es
#ifdef GL_FRAGMENT_PRECISION_HIGH
  precision highp float;
#else
  precision mediump float;
#endif

uniform usampler2D s_textureCamera;
in vec2 g_vVSTexCoord;
out uvec3 out_color;

void main()
{
out_color.rgb = texture( s_textureCamera, g_vVSTexCoord ).rrr;
}

这就是我想要的:

http://i.imgur.com/YOKis9C.jpg

这就是我真正拥有的:

http://i.imgur.com/JoiCGi7.jpg

我不知道为什么会有这个结果。你有什么想法吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

事实上,似乎我不能使用浮动纹理然后整数...如果我将第一个纹理配置为GL_RGBA8UI它可以工作。

是否有关于纹理和格式的教程或解释?因为我已经在格式和内部格式上犯了一些错误,对我来说,规格是不够理解的。

由于

答案 1 :(得分:0)

您的jmagick can't find dependent libraries 纹理采样器是单通道unorm浮点纹理;即它将返回0到1之间的浮点值。如果将其转换为整数值,那么就像CPU上的C代码一样,它将变为0或1。

如果要输入整数纹理,则需要将正在阅读的纹理设为R8,而不是R8UI

如果你需要使用unorm纹理,那么你只需要重新缩放浮点数,这样就可以扩展转换为整数以填充你期望的范围。

R8