我正在尝试编写一个简单的测试程序来演示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),但这里没有任何有效性条件适用。