Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在glRenderBufferStorage()中使用RGB10_A2_UI格式_Opengl_Opengl 3_Fbo - Fatal编程技术网

Opengl 在glRenderBufferStorage()中使用RGB10_A2_UI格式

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

我正在使用FBO并渲染到纹理。这是我的密码:

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_RGB10_A2UI,而不是GL_RGB10_A2。”。为什么?您需要什么
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“我的工作是确保司机没有对我们撒谎!”-但是错误的使用并没有任何帮助。答案反复指出了您做错了什么(在不应该的地方进行规范化,写入浮点输出变量)。如果你自己做错了,你就不能指望司机工作正常。