Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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
C++ 当使用GL_RGBA16F_ARB-texture时,它只包含垃圾,但我没有收到错误消息_C++_C_Opengl_Fbo - Fatal编程技术网

C++ 当使用GL_RGBA16F_ARB-texture时,它只包含垃圾,但我没有收到错误消息

C++ 当使用GL_RGBA16F_ARB-texture时,它只包含垃圾,但我没有收到错误消息,c++,c,opengl,fbo,C++,C,Opengl,Fbo,我生成如下纹理: GLuint id; glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2

我生成如下纹理:

GLuint id;

glGenTextures(1, &id);

glBindTexture(GL_TEXTURE_2D, id);

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

glTexImage2D(
    GL_TEXTURE_2D, 0,
    GL_RGBA16,
    //GL_RGBA16F_ARB, //< Won't work
    256, 256, 0, GL_RGBA, GL_FLOAT, NULL
);

glBindTexture(GL_TEXTURE_2D, 0);
GLuint-id;
glGenTextures(1,&id);
glBindTexture(GL_纹理_2D,id);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glTexImage2D(
GL_纹理_2D,0,
GL_RGBA16,
//GL_RGBA16F_ARB,//<不起作用
256,256,0,GL_RGBA,GL_FLOAT,NULL
);
glBindTexture(GL_TEXTURE_2D,0);
我将其附加到帧缓冲区对象(FBO)以进行渲染。当我将内部格式设置为
GL\u RGBA16
时,所有这些都非常有用。然而,我需要一个更高的动态范围,我认为
GL_RGBA16F_ARB
可能会达到这个目的

不幸的是,如果我在上面给出的代码中将
GL_RGBA16
替换为
GL_RGBA16F_ARB
,纹理似乎停止工作。我没有尝试渲染到FBO/纹理棒,当我使用纹理时,它包含随机垃圾。(结果是紫色的很多)如果我收到一条错误信息,暗示可能有什么问题,这不会让我感到沮丧,但我似乎找不到一条。换句话说,
glGetError()
glTexImage2D
调用后返回
0
,并且
glCheckFramebufferStatusEXT(GL\u FRAMEBUFFER\u EXT)
在附加纹理后返回
GL\u FRAMEBUFFER\u COMPLETE\u EXT

我没有弄乱
glClampColorARB(…)
。。。然而:)

  • 我是否忘了在我没有想到的地方/方式检查错误
  • GL_RGBA16F_ARB
    -纹理需要我没有给予的任何特殊处理吗
  • 还有什么可能是错误的吗
  • 我被难住了,因为使用
    GL_RGBA16
    ,一切都很顺利:(

    编辑:当使用
    GL_RGBA16F_ARB
    时,我尝试渲染到屏幕上的第一帧无法显示。在我看来,我应该在某个地方收到错误消息

    编辑:通过检查ShadowIce的工作代码示例,我发现如果我更改FBO上的深度缓冲区,问题就会消失,并给出
    glRenderBufferStorageEXT(…)
    GL\u DEPTH\u component 24
    作为它的第二个参数,而不是
    GL\u DEPTH\u component 16
    。我不知道为什么会这样,但显然它确实起作用


    此外,如果我在那里进行相反的替换,ShadowIce的代码也会像我一样中断。

    设置具有浮动纹理的帧缓冲区不应该有什么特别的事情要做。有些事情我会检查:

  • 在调用glCheckFramebufferStatusEXT之前,FBO绑定和绘制/读取缓冲区设置是否正确?在绘制到它之前,请尝试测试它
  • 使用特定的透明颜色进行简单的glClear后,纹理看起来是否正常?如果是,则着色器(如果使用)或绘制FBO的方式可能有问题
  • 您的驱动程序是最新的吗?在使用不同硬件的PC上是否仍然存在此问题
  • GL_RGBA32F_ARB怎么样
  • 编辑:

  • 检查帧缓冲区和纹理的id,同时检查纹理id是否与附加到fbo的id匹配(使用glGetFramebufferAttachmentParameteriv)。通常,如果它使用RGBA纹理,但使用随机数据(尤其是紫色),我会猜测一切都正常这是一个很好的迹象,表明纹理中没有写入任何内容或未正确清除

  • 我已经编写了一个小的示例应用程序,它应该可以工作,也许会有帮助。我只在windows上测试过它,所以对于linux,您可能需要对其进行一些更改:

    对于设置具有浮动纹理的帧缓冲区,应该没有什么特殊的操作。我会检查一些事情:

  • 在调用glCheckFramebufferStatusEXT之前,FBO绑定和绘制/读取缓冲区设置是否正确?在绘制到它之前,请尝试测试它
  • 使用特定的透明颜色进行简单的glClear后,纹理看起来是否正常?如果是,则着色器(如果使用)或绘制FBO的方式可能有问题
  • 您的驱动程序是最新的吗?在使用不同硬件的PC上是否仍然存在此问题
  • GL_RGBA32F_ARB怎么样
  • 编辑:

  • 检查帧缓冲区和纹理的id,同时检查纹理id是否与附加到fbo的id匹配(使用glGetFramebufferAttachmentParameteriv)。通常,如果它使用RGBA纹理,但使用随机数据(尤其是紫色),我会猜测一切都正常这是一个很好的迹象,表明纹理中没有写入任何内容或未正确清除

  • 我已经编写了一个小示例应用程序,它应该可以工作,也许会有帮助。我只在windows上测试过它,所以对于linux,您可能需要对其进行一些更改:

    GL\u HALF\u FLOAT\u ARB可以作为类型而不是GL\u FLOAT。

    GL\u HALF\u FLOAT\u ARB可以作为类型而不是GL\u FLOAT。

    您实际上是如何填充纹理的?我将其附加到FBO并对其进行渲染。对我来说情况类似。当我使用GL_RGBA16时,它很好。当我使用GL_RGBA16F时,它会随机产生一些NaN,比如垃圾颜色和轻弹。你实际上是如何填充纹理的?我将其附加到FBO并对其进行渲染。对我来说情况类似。当我使用GL_RGBA16时,它很好。当我使用GL_RGBA16F,它会随机产生一些NaN,比如垃圾颜色和flicking。1.是的。在绘图之前通过测试验证,2.不,它看起来不正常,3.我从Ubuntu存储库获取驱动程序。应该是合理的最新版本(nvidia).我在不同的机器上遇到相同的问题,4.我有时会得到相同的结果,但现在它显然已完全锁定!(4.继续:)在调试器中破坏堆栈时,我