Opengl 在glRenderBufferStorage()中使用RGB10_A2_UI格式
我正在使用FBO并渲染到纹理。这是我的密码:Opengl 在glRenderBufferStorage()中使用RGB10_A2_UI格式,opengl,opengl-3,fbo,Opengl,Opengl 3,Fbo,我正在使用FBO并渲染到纹理。这是我的密码: GLuint FramebufferName = 0; glGenFramebuffers(1, &FramebufferName); glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); GLuint renderedTexture; glGenTextures(1, &renderedTexture); glBindTexture(GL_TEXTURE_2D, rende
GLuint FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB10_A2UI,256,256,0,GL_RGBA_INTEGER,GL_UNSIGNED_INT_10_10_10_2,0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
GLuint color_buffer;
glGenRenderbuffers(1, &color_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB10_A2UI, 256, 256);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_buffer);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,renderedTexture, 0);
GLenum DrawBuffers[2] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
GLuint textureId;
LoadImage(textureId); // Loads texture data into textureId
Render(); // Renders textureId onto FramebufferName
glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind default FBO
glBindTexture(GL_TEXTURE_2D, renderedTexture); //Render using renderedTexture
glDrawArrays (GL_TRIANGLE_FAN,0, 4);
输出不正确。图像渲染不正确。如果我使用格式GL_RGBA而不是GL_RGB10_A2UI,一切都会很好。FBO已完成GLU帧缓冲区,没有问题。我做错什么了吗
我的GL_RGB10_A2UI片段着色器是:
in vec2 texcoord;
uniform usampler2D basetexture;
out vec4 Color;
void main(void)
{
uvec4 IntColor = texture(basetexture, texcoord);
Color = vec4(IntColor.rgb, 1023.0) / 1023.0;
}
对于GL_RGBA,我没有在着色器中执行规范化
如果我使用格式GL_RGBA而不是GL_RGB10_A2UI,一切都会很好
如果这是真的,则表示着色器没有写入整数
我们以前讨论过这个问题,但你似乎不太明白。整数纹理与浮点纹理或规格化整数纹理截然不同
在任何情况下,GL_RGBA8
纹理和GL_RGB10_A2UI
纹理都不能使用相同的代码。同一着色器无法从可以规格化或整体纹理的纹理中读取。同一着色器无法写入可以规格化或积分的缓冲区。同一像素传输代码不能写入或读取可以标准化或积分的图像。它们在各个方面都是不同的实体,需要不同的参数来访问它们
此外,即使着色器可以写入其中任何一个,它会写入什么?整数纹理取整数;如果您试图将[0,1]范围内的浮点值固定为整数,它将显示为0或1。如果你试着把一个整数放在[0,1]范围内,如果你的整数是0,你会得到0,否则会得到1。所以无论你的片段着色器在做什么都是非常混乱的
尽管您相信自己确实打算使用GL\u RGB10\u A2UI
,但您确实应该使用GL\u RGB10\u A2UI
,这种可能性非常大。如果你真的想写整数,你的着色器将写整数而不是浮点数,因此你的着色器将不会“工作”于GL\u RGBA8
但是,如果您真的非常想使用无符号整体纹理,并且您真的非常了解这意味着什么以及它与GL\u RGB10\u A2
的区别,那么您必须做以下几件事:
- 任何打算写入整数纹理的片段着色器都必须写入整数输出变量。并且该输出的已签名/未签名状态必须与目标映像的已签名/未签名格式匹配。因此,对于您的
,一种无符号整数格式,您必须写入GL\u RGB10\u A2UI
。您应该将整数写入此值,而不是浮点值uvec4
- 任何打算从整数纹理读取的着色器都必须使用。而且采样器统一必须与图像的有符号/无符号格式相匹配。因此,对于您的
,您必须GL\u RGB10\u A2UI
- 像素传输操作必须明确使用
像素传输格式\u整数
GL\u RGB10\u A2UI
?因为您似乎并不真正理解“具有整数的纹理”和“具有规格化整数的纹理”之间的区别。如果你不理解这种差异,你可能没有理由想写一个完整的纹理。你添加的代码似乎只是证实你不清楚标准化纹理是如何工作的。你自己不做标准化。如果要在RGB10_A2中使用规范化整数,则不需要UI
版本。就这么简单。我不是在使用相同的片段着色器来处理GL_RGB10_A2UI和GL_RGBA。请阅读编辑。我也在做相应的修改GL源代码。当我的格式是GL_RGB10_A2UI时,我不知道如何写入uvec4?类型是GL_UNSIGNED_INT_10_10_10_2,所以如果我必须在片段着色器中写入uvec4,我们如何进行规范化?@maverick9888:“我们如何进行规范化”如果你想要规范化格式,你应该使用规范化格式。你知道,就像GL\u RGB10\u A2
。它是一种规范化的无符号整数格式。它为你做了所有的工作。@maverick9888:你用什么来计算一个数字与你在哪里使用这个数字无关。从片段着色器写入的值必须与正在写入的图像相匹配,而不是与刚读取的图像相匹配。此外,您从未回答过我上面的问题,即如果您只是让OpenGL来做,为什么需要手动执行OpenGL将自动执行的操作。你正在把一些非常简单的东西变成更复杂的东西。@maverick9888“我的工作是确保司机没有对我们撒谎!”-但是错误的使用并没有任何帮助。答案反复指出了您做错了什么(在不应该的地方进行规范化,写入浮点输出变量)。如果你自己做错了,你就不能指望司机工作正常。