我编写了一个生成噪声的着色器,它使用 gl_TexCoord[0].xy(由 SFML 生成的东西)作为输入,并为每个像素输出一个浮点数。
我想要 CPU 上的数据,作为一个 32 位浮点数组。
这是我正在做的事情:
//using opengl 3.0 (I also tried 3.2)
ContextSettings settings(0, 0, 0, 3, 0);
sf::RenderWindow window(sf::VideoMode(windowsize.x, windowsize.y),
"yada", 7, settings
);
在这里,我在创建纹理后覆盖纹理。我正在使用只有 opengl1.1 标头的 Windows,所以我必须手动设置 GL_R32F(很高兴由 dav1d 完成):
#ifndef GL_R32F
#define GL_R32F 0x822E // found this in glad.h for opengl 3.0, easy guess is that this value doesn't change across opengl versions
#endif
auto handle = sprite_perlin.getTexture()->getNativeHandle();
glBindTexture(GL_TEXTURE_2D, handle);
auto size = sprite_perlin.getTexture()->getSize();
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, size.x, size.y, 0, GL_RED, GL_FLOAT, NULL);
}
在这里,我将纹理数据读入值:
float values[4096];
// whole_size is the size of the texture, here it is 60
if(whole_size*whole_size < 4096)
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, values);
Image brought_back;
brought_back.create(whole_size, whole_size, Color::Red);
float mi = 1e20, ma = -1e20;
for (int i = 0; i < whole_size; ++i) {
for (int j = 0; j < whole_size; ++j) {
brought_back.setPixel(i, j, { 0,Uint8(255.f*values[whole_size*i + j]),0 });
ma = max(values[whole_size*i + j], ma);
mi = min(values[whole_size*i + j], mi);
}
}
mi 和 ma 均为 0.0f;
这是在带有着色器的精灵上显示时产生的噪声(具有一些带有浮点数的颜色函数)着色器按预期工作,我只想在 CPU 上检索数据作为浮点数。
这是着色器的简化版本:
uniform int texture_size;
float get_value_at(ivec2 pixel_coord) {
//dummy value
return 0.34f;
}
void main(){
ivec2 pix_pos = ivec2(gl_TexCoord[0].xy*texture_size);
float val = get_value_at(pix_pos);
gl_FragColor = vec4(val,0,0,1);
}
