【发布时间】:2016-12-12 19:14:15
【问题描述】:
我正在尝试在 iOS 设备上进行一些 GPGPU 编程,但我找不到任何有关如何设置 openGL ES 3.0 环境的资源。我了解如何在片段着色器中进行计算,但我无法将浮点数组传递给片段着色器的统一采样器变量。
这就是我设置 FBO 和分配 CPU 内存的方式:
float** dens = (float**) malloc(W*sizeof(float*));
for (int i = 0; i < W; i++) {
dens[i] = (float *)malloc(H*sizeof(float));
}
// input value
for (int i = 0; i < W; i++) {
for (int j = 0; j < H; j++) {
dens[i][j] = 1.0f;
}
}
GLuint FBO;
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
GLuint dens_gl = load_texture(W, H, GL_RGBA, 0, dens);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
这是我的 load_texture 代码:
GLuint load_texture(const GLsizei width, const GLsizei height, const GLenum type, int tex_number, const float** data) {
GLuint texture_object_id;
glGenTextures(1, &texture_object_id);
assert(texture_object_id != 0);
glActiveTexture(GL_TEXTURE0 + tex_number);
glBindTexture(GL_TEXTURE_2D, texture_object_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, data);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + tex_number, GL_TEXTURE_2D, texture_object_id, 0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
NSLog(@"failed to make complete framebuffer objects %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
glBindTexture(GL_TEXTURE_2D, 0);
return texture_object_id;
}
还有我的fragmentsshader.fsh:
uniform vec2 uResolution;
uniform vec2 aPosition;
uniform sampler2D dens_gl;
void main(void) {
vec2 uv = aPosition.xy / uResolution.xy;
gl_FragColor = texture2D(dens_gl, uv);
}
没有错误代码,但我只能看到黑屏,由于我在 CPU 内存中将值设置为 1,因此我们期待白屏。我哪里做错了?
【问题讨论】:
-
你想做什么?您显示了帧缓冲区的设置代码,但问题似乎是关于如何使纹理工作。这两件事彼此无关。
-
@BDL 我正在尝试将 CPU 浮点数组数据输入到我的片段着色器,但我的设置不起作用。我展示了我的 FBO 代码,因为当我尝试将内部格式更改为 GL_R32F、格式为 GL_RED 并键入 GL_FLOAT 时,它给了我 GL_INCOMPLETE_ATTACHMENT。上面的代码没有任何错误,但我的 iOS 设备上仍然出现黑屏。