我在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
我不知道为什么会有这个结果。你有什么想法吗?
感谢您的时间。
答案 0 :(得分:0)
事实上,似乎我不能使用浮动纹理然后整数...如果我将第一个纹理配置为GL_RGBA8UI它可以工作。
是否有关于纹理和格式的教程或解释?因为我已经在格式和内部格式上犯了一些错误,对我来说,规格是不够理解的。
由于
答案 1 :(得分:0)
您的jmagick can't find dependent libraries
纹理采样器是单通道unorm浮点纹理;即它将返回0到1之间的浮点值。如果将其转换为整数值,那么就像CPU上的C代码一样,它将变为0或1。
如果要输入整数纹理,则需要将正在阅读的纹理设为R8
,而不是R8UI
。
如果你需要使用unorm纹理,那么你只需要重新缩放浮点数,这样就可以扩展转换为整数以填充你期望的范围。
R8