OpenGL 4.2中的ImageTextures问题

时间:2012-05-28 18:29:32

标签: opengl glsl

我正在尝试编写一个简单的测试程序来演示GLSL 4.2的ImageLoad函数的功能。到目前为止,我有:

  • 一个简单的着色器,用于从image2D加载左下角的纹素并显示它。
  • 绘制全屏小队的一些简单顶点代码
  • 用于创建上下文,编译着色器等的其他脚手架代码。

这是我的frag代码(顶点是一个简单的passthrough着色器):

#version 420

#include <gtest/SmallImage.h> //NOTE: I have a preprocessor that takes care of includes

layout(binding = SMALL_IMAGE_ONE_BINDING, rgba8) uniform image2D image_one;

smooth in vec2 texture_coords;
out vec4 out_color;

void main(void)
{
  vec4 loaded = imageLoad(image_one, ivec2(0,0));
  vec4;
  out_color = vec4(loaded.r,
               loaded.g,
                   gl_FragCoord.y/1200.0,
                   1);
}

非常简单,没有发生意外的阅读空间。蓝色通道与像素坐标成比例,让我知道即使imageLoad调用失败,四边形也正确呈现。

这是我用来渲染到屏幕的C ++循环。它绑定纹理,写入单个黄色纹理,然后渲染全屏四边形。有两种变体:定义MAKE_ONCE时,纹理在循环之前生成一次。如果未定义,则在循环的每次迭代中生成新纹理:

MyTestFun(void)
{
  glm::vec4 yellow = glm::vec4(1.0, 1.0, 0.0, 1.0); 

#ifdef MAKE_ONCE
  renderer->InitFrame();  //sets current OpenGL context 
  GLuint name = 0;
  glGenTextures(1, &name);   
  renderer->EndFrame();  
#endif

  while(1)
  {     
    renderer->InitFrame();

#ifndef MAKE_ONCE
    GLuint name =0;
    glGenTextures(1, &name);   
#endif

    glBindTexture(GL_TEXTURE_2D, name);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_FLOAT,
                 glm::value_ptr(yellow));

    glBindTexture(GL_TEXTURE_2D, 0);

    glBindImageTexture(SMALL_IMAGE_ONE_UNIT, name, 0, false, 0, GL_READ_ONLY,
                       GL_RGBA8);


    renderer->FullscreenQuad(); //shades using the frag shader shown above

    //bind the default texture to the image unit, hopefully freeing ours for editing
    glBindImageTexture(SMALL_IMAGE_ONE_UNIT, 0, 0, false, 0, GL_READ_WRITE,
                       GL_RGBA8);

    renderer->EndFrame();
  }
}

定义MAKE_ONCE时,第一帧显示从白色到黄色的垂直渐变,但后续帧显示从蓝色到黑色的垂直渐变,表示IMAGE_LOAD调用返回0.0。 / p>

未定义MAKE_ONCE时,例如纹理在每一帧上重新制作,程序按预期运行,在每一帧上显示相同的白色 - 黄色渐变。

可能导致此行为的原因是什么? OpenGL 4.2规范说如果图像处于无效状态,imageLoad调用将返回黑色(全零)(p255-266),但这里没有任何有效性条件适用。

0 个答案:

没有答案